{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# BBBP: Test with stratified sets on the SMILES length"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "#from sklearn.linear_model import LinearRegression, LogisticRegression\n",
    "#from sklearn.ensemble import RandomForestRegressor\n",
    "from sklearn.neural_network import MLPRegressor, MLPClassifier\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import mean_squared_error, r2_score, roc_auc_score, precision_recall_curve, auc\n",
    "\n",
    "import seaborn as sns\n",
    "sns.set_style('dark')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/honda/anaconda3/envs/deepchem/lib/python3.5/site-packages/matplotlib/figure.py:459: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n",
      "  \"matplotlib is currently using a non-GUI backend, \"\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZgAAAIiCAYAAAD1gt7bAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3Xd8FGX+wPHP9t1k00hvlAQYepEOiqJylrOeFet5lt+p5+l5Z5fzlENPset5lvNUQMGuWLFLR0E6MkAIAdKBlN1NNrs7M78/ZhOSkErKpjzv14vX7s48M/vNJOx3n2eeYtA0DUEQBEFob8ZQByAIgiD0TCLBCIIgCB1CJBhBEAShQ4gEIwiCIHQIkWAEQRCEDiESjCAIgtAhRIIRBEEQOoRIMIIgCEKHEAlGEARB6BAiwQiCIAgdwhzqAEJJVVVNUY59qhyTyUBbju9txPVqHXG9Wkdcr9Zpy/WyWEwHgfjmyvXqBKMoGqWlFcd8fHR0WJuO723E9Wodcb1aR1yv1mnL9YqPj8hpSTnRRCYIgiB0CJFgBEEQhA4hEowgCILQIUSCEQRBEDqESDCCIAhChxAJRhAEQegQIsEIgiD0Mj6lqlPep1ePgxEEQeiJfIqPIm8h+RV5FFTmU1CRT0FlHvkV+RRW5lPiK+HGkTdxUfoVHRqHSDCCIAjdjKIGKPIW1Uoe+UeSSWU+h7wH0TgySt9sMJPgSCTZkcKUxONJdqRwdsY54O/YOEWCEQShW9A0DZ+i4VdU/Ipa67n+ONBi7jFt/qqmcsh7UE8clXk1SaT6schbhKopNeWNGImzx5MclsK42AkkhSWT7EghMSyJZEcKsfY4TAZTnfeIDu/4mQ9EghEEoQ5V02o+tOt/kPtqth35YPcpGv6Ail+t/Ty4L6BvC6j68yPn0I6cR9WPqb29ofcNqM3Pm5UYYUNKcCIlhCMlRCAlhJMYYcNgMHTClWs5TdMo8ZVQWF3zqK6FVOZRWFFAobcAv1q3ehFriyMpLJkRMSNJdCSTHJZCkiOZpLBkEuyJmI1d7+O80yOSJOkm4A4gGdgG3CbL8vImyt8M/AnoD+wD5sqyPL/W/t8DrzVwqEOWZW/7RS4Inaeg3Mtel4/DZRX4A1qdD+/6H8oBVav5IK/+cK6dDOomhnof2rW2VX/At+SDvDUsJgNWkxGz0YDVbMRiMmI1GbCYjjy3mo2E20xYa20zm4zB14Y6x9Tdpj83Gw0c9qlszDmMXORmedahmgaiaIelTsIZkhhBWrQdYwcmHU3TcPldFARrH/mV1TWQI/dEqtS6N9qjrdEkOpIZGDWY45Omk+RIITksmURHMkmOJKwmW4fF21E6NcFIknQJ8AxwE7Ai+PiFJEnDZFne10D5G4FHgeuBtcBE4BVJkkpkWf6kVtEKILP2sSK5CN1RWaWf/6zcyweb8mntx3xDH+SWeh/qVrMRZ60P8vof1M19kNd+Xn+bObjNajJiMRuwGPX9nVV7iI4Oo3REIgAVPoVdxW7kIg87i9zsKHLz1voDNckz3GpiUHx4sLbjZEiikwF9wjCbWt7IVhHwkF9xJHHkV+YHayT6oyfgqVPeaY4gKSyJ9PB+TIyfrNdCHCkkhSWR5EjGYQ5rv4vRRXR2DeZ24HVZll8Jvr5FkqTTgRuBexoofyXwiizLi4Kv90iSNAG4C6idYDRZlgs6KmhB6GiqprFkSwHPL8/GVRXg4rEpnDoiGV+l76gP/VB/kHcHYVYTo1OjGJ0aVbPNr6jsOViBHEw4cpGbJVsLqPSrAFhNBjLjwo8knDgLzrByDvsLaxJH7R5Z5f7yOu9pNzlIdiSTGJbM6D5jgs1Xei0kyZGM0xLRqdegK+i0BCNJkhUYBzxeb9dXwNRGDrMB9WsilcBESZIssixXN1I6JEnKAUzARmC2LMsb2idyQehY2wtcPPbtbrYVuBiTGskdJw9kcIJTTD/fziwmI1KiEynRyTmAX/WT7ylgS/FethbnsKd8PwWV+XzrLuZr7yGMue46x5uw0MeWSFp4CicmDyU5eP8jyaH/i7JGiyRfT2fWYOLQE0Bhve2FwKmNHLMUuFaSpA+AdegJ6jrAEjxfPiADfwA2ARHArcBKSZJGy7K8q6mATCYD0dHHXi01mYxtOr63EderrpIKH098vZN31h8gNtzKvAtGcu7olJoPKXG9Wqf+9QqoAYoqi8hz55LnySPXnUueO488Tx55nlyKKoqO6sqbFJ3E0PAUoiyjMAT6UFERxcHScHIKbBSVWSnFyB4gPcbBsORItJRIYpIjccZFEuPsXvdIOuPvKxTdDuo3LRsa2FZtDpAErAqWKwTeAO4EFABZllcDq6sPkCRpFXot5hbgz00FIhYc61zieukUVePjLfm8sGIv7qoAl45N5Yap/XDazJSVVdaUE9erZVRN5afi1Rzw7SX7cE5NM1aRtxClVldeAwbi7QkkhSUzOuY4klLq9sSKs8VhaqIn1iGPDznYtCYXudmWV8bS7Ue+L8eFWxmS6GRwgpMhwXs7yZFdrwdbtTYuONaicp2ZYA6iJ4WketsTOLpWA4Asy5XAHyRJ+j8gEb3GcgPgCp6voWMUSZLWAYPaKW5BaDfb8st59Nvd/FroZmxaFHeePJCB8eGhDqtb8qt+vsldyuI9C9nv0fsI9bHFkuRIZmj0cE4OO5Wk6gTiSCbBkYjFaDnm94sNtzJ1QB+mDuhTs81dFaiTdOQiN6uyD1PdES/SbmZwghMpXr+vIyU46RvjwGTsmkmnvXVagpFl2SdJ0npgJvBurV0zgfebOdYPHACQJOlS4FNZltWGykqSZABGoTeZCUKXUFrh5/kV2SzZUkBsuJU5Zw7htCHxXfbbbVdWGajg0/1LeDd7EQe9xQyMHMzfx87h9EEz8bob/FjoME6bmXHp0YxLj67Z5vUrZB301HQk2FHo5t2NufgUPevYzUYG1SQcvVNBRmw4VnNPGSZ6RGc3kT0JLJAk6SdgJfBHIAV4EUCSpPkAsixfFXw9GJgErAFi0HuhjQCurj6hJEkPBPfvAiLRm8VGofdME4SQUlSNDzfn85+Ve/FUBZg1LpXrp+jNYULrlPlK+XDve3yY8y4uv4sxfY7jjpH3MD5uEgaDAbvZjpfQNynaLSaGJ0cyPDmyZltAUdl7uJIdRS7kIg9yoYvPtxfy7ka9Cc9sNJARG1ZTy5ESnAyKdxJmNTX2Nt1Cp/6Vy7L8tiRJscD96AMttwJnyrKcEyzSt94hJvSkIqHPmvM9MFWW5b21ykQDL6M3vZUBG4Dpsiz/1FE/hyC0xJa8ch77djc7ityMS4/ijpMHkhknmsNaq7CygHezF/P5/iV4FS/TEqczK+MKhsWMCHVoLWY2GRkYH87A+HDOGq5vUzWN3FJvTU1HLnSzLOswS7bqdwwMQN8YR52kIyU4iXIcezNfZzNoWvuO2u1O/H5FEzf5O09vuV6HK3w8vyybT7YVEu+0ctuJGcyUWt8c1luuV2P2urJ5e8+bfJO3FIBTU07jkozL6R8xoMHyPeF6aZpGkdtXk3Cq7+sUuI6M+k+O1KfDqd2ZIN5p7dS/r/j4iPXA+ObKiXq6ILQTRdV4f1M+L67cS4Vf4crxaVw7pS/hVvHfrDV+Ld3GW1kLWFm4DLvJzrn9LuCiAZeS6KjfP6jnMRgMJEbYSIywMT0ztmZ7aYUfufhI0tlR5ObH3Uemw+kTZqmTcIYkOkmNsof8Hp/4yxeEdrApt4zHvt3NzmIPE/pGc8fJAxkQK8awtJSmaaw7uJZFWQvZePgXIiwRXDXwD5zf/0KirNHNn6CHiw6zMKlfDJP6xdRs8/gC7Cry1NRydhS5WbDuAEqt6XBqN61JiU769wnD3Ik92ESCEYQ2OOTx8dzybD7bVkiC08ojZw3llMFxIf/m2F0omsLygh94K2sBu8t3EmeP58ahf+as9HN65Nxc7SncamZMWhRj0o5Mh+MLqGQd8iAX6glnZ5GbDzbnUxXQe9fZzEYGBqfDue7ETOKtHdtzTSQYQTgGAVXjvY15vLRqL16/ytUT0/nDpL7dvtdPZ/EpPr7K/Zy397xFbsUB0sL7csfIezkl5TdYTdZQh9dtWc1GhiZGMDTxyEDIgKqxr6Sipsv0ziI33+4sRkqJ5HfDEzs0HpFgBKGVNhwoY953u9lV7GFyvxj+enIm/fuIb9st4fF7+GT/R7yf/TaHqg4iRQ3hH8c9zLTEE45aEEtoH3oX6HAyYsM5Y+iRhNIZnSJEghGEFjro8fHcsj18vr2IxAgbj54zjBkDY0VzWAuUVB3mg73v8nHOB7gDLsbFTuCe0X9nbOw4cf16MJFgBKEZAVXjnQ25vLwqB5+ics2kdK6Z1BeHRXzjbk5BRT5vZ7/FF/s/wa/6OSHpRGZlXIkUPTTUoQmdQCQYQWjCLwdKeezb3WQdrGBK/xj+dvJA+sY4Qh1Wl5ftymJR1kK+y/8GIwZ+k3oGF2dcRl9nv1CHJnQikWAEoQHF7iqe+XEPS3cUkxxpY945wzhRNIc1a2vJFt7Kms+aopXYTQ4u6H8RFw6YRbw9PtShCSEgEowg1BJQVBZvyOOVVTkEVJVrJ/fl9xPTsYvmsEZpmsba4tUsylrAlpJNRFqiuGbQ9Zzb7wIirZHNn0DosUSCEYSg9ftLefTb3WQfqmDagD78dUYm6aI5rFGKGuCHgu9YlLWQPa7dJNgT+dOw2zgj7WwcZnHdBJFgBIEil94c9pVcTEqkjcfPHc70zD6iOawRVUoVXx74jHf2vEV+ZR79nAO4e9RsTk6ZibmJBbuE3kf8NQi9ll9RWfxLLv9dvY+AqnL9lL5cNUE0hzXG7XezZN8HvJ/9DiW+wwyNHs5Nw/7MlITjMRp63lomQtuJBCP0Sj/llDDvu93sPVzJCRl9uH1GJmnRolmnIYerDvFe9tt8su9DPAEPE+MnMyvjSkb1GSNqeUKTRIIRepVCVxVP/5DFNzsPkhpl56nzh3N8RmzzB/ZCuZ4DvJO9iC8PfIaiBjgxeQaXZlzBoCgp1KEJ3YRIMEKv4FdU3lqfy6trclA1uGFqP66akI6tBy5T21a7y3eyKGshP+Z/h8lo4rTUM7kk43JSw9NCHZrQzYgEI/R4a/fqzWE5JZWcmBnLX2ZkkBolmsNq0zSNzSUbWZS1kJ+KVxNmDuPijFlc0P8SYu1xoQ5P6KZEghF6rIJyL0/9sIfvdh0kPdrO078bwbQBfUIdVpeiaiqri1ayKGsB20u3Em2N5trB/8e5/X6H0xLR/AkEoQkiwQg9ji+g8ub6A/xvzT404MZp/bl8fJpoDqsloAb4Lv9rFmctZK87myRHMrcO/yunp52FzWQLdXhCDyESjNCjrMo+zBPfZ7GvpJIZg+L4y0kZJEfaQx1Wl+FVvHy+/xPe2fMWRd5CBjgzuHf0A8xIPgWTGMMitDPxFyX0CHllXp76IYsfdh+ib4yDZy8YwZT+ojmsmstfzkc57/PB3ncp85UyImYUt434G5Pip4quxkKHEQlG6NaqAioLft7P6z/txwDcdHx/Lh+XhlU0hwFw0FvMu9mL+XTfx1QqFUyOn8qszCsZ2Wd0qEMTegGRYIRua8WeQzzxfRYHSr2cMjiO207MIEk0hwGw372Pt7Pf5OvcL1E0lZOTT+GSjCvIjBwY6tCEXkQkGKHbyS2r5Mnv97As6xD9Yhw8f8FIJvWPCXVYXcLOsh28lbWA5QU/YDFaODPtbC7KmEVKWGqoQxN6IZFghHanlpeh5Oai5h5AyTugPy8uwp+ZgTp0BJZRYzHGtX5shdevsODnA7zx836MBrjlhAHMGpeKxdS7m8M0TWPDofUs2rOA9Qd/Jtzs5LLMKzm//8X0sYn7UELoiAQjtJqmqqjFxSh5B/Qkkptb57nmdtUpb+gTiyk+nvKPP0JbvAgAY2oallFjsIweg2XUGIxp6U3ebF6WpTeH5ZV5OXVwPLedlEFiRO/uTqtqKisLl7MoawE7yrbTxxbLDdJNnNX3PJwWZ6jDEwSRYISGaT4fSn5esBaSi5J7ACX3AGpeLkp+Hvh8RwqbTBiTkjGlpGIbOhxjahqmlFRMwUeDQx81HxVu4eC6Tfg3bSCwaQO+Vcup+uJTQE9C1cnGMnospoxMDCYTB0oreeL7LFbsOcyAPmH8+8KRTOzXu5vD/Kqfb3KXsnjPQvZ79pESlsrtI+7kN6lnYBVjWIQuRCSYXkx1letJIzeYQKqbs/IOoBYXg6YdKexw6EmjX3+sU47HmBpMIKlpGBMSMZib/1MyWCxYhg7DMnQYXHo5mqqi5OzFv3kjgU0b8W/agO/7b/XC4U7y0wbxtSUZT3wmt50xjYsn9u/VzWGVgQo+2/8J72YvothbxMDIQcwe8xDTk04SY1iELsmg1f4Q6WX8fkUrLa045uOjo8Noy/EdTVNV1IPFegLJOxCshegJRMnNRXOV1ylviOmDKTUVU0qankBS0oJJJBVDTNsX4GrJ9Qrk57H16xXs/mE1GQW76Osq0ndYbZiHDtNrOaPHYh4xEmNYeJvi6eqqr1eZr4yPct7jw73vUu4vZ3SfsVyWeSXj4yaJMSy1dPX/j11NW65XfHzEemB8c+XE155uTvP5UAryg/c/jjRnqbnVTVlVRwqbTBgTkzClpmE7eSjG6mas1FSMKakh/8DeX1LJ46sPsao4iYzpl3PnKQPp49Twb9mIf9NGAps3UvnmfCrnvwZGI+ZBgzEHm9Qso8ZgjOlZTWcFngJe3f4an+3/GK/iZVriCVyacQXDY0aGOjRBaBFRg+kGNRjV7a7TI0u/FxKsjRQV1m3KstuDNQ89eRxJImkYE5Na1JTVURq7Xl6/wmtr97Fg3QGsJiM3TO3HxWNSMDfQHKZWeAhs24o/2KQW2L6tJoma+vXXE06w84AxKbnLfcP3KVW4Ax7cfheegAeP34074MYTcOP2H3k85D3I6uIVaJrGKSm/4dKMK+gfMSDU4XdpogbTOqIG00toqop66GAwieQd1TtLKyurU94QHYMpNVX/1h6sgVQnFUOf2C73odoYTdP4fvchnvo+iwJXFWcMTeDP0wcQ52z8RrUxLBzrhElYJ0zSz+HzEZB34N+8Af+mjfi+/4aqTz7SyyYk6M1pwYRj6jcAg/HY7+EomkJloKJOInAH3EeSRCPJQk8kLtwBD37V1+R7GDESbgnHaY7gwoEXcU7qhSQ5ko85ZkEIJVGD6aQajOb3o+bnHd0jK/eA3pRVVaspy2jEmJhYcw+kTi0kJQVjePfsglr7euUcruDx77JYk1PCwLhw7jxlIGPTotr8HpqioGRn6TWcYOcB9dBBfWdkJAwfhm/YQNxD+1PWNxa3VtlAQjiSGGpqGgH9dXPsJjvhZidOi5NwczhOS4T+aI6oSRy1H4+U1R8dprCaLwjiG3nLGDxF2Hd+gMOsUGGKQQ1LRA1PQA1LQHXEgugA0SBRg+lmVI/76B5ZwfsialEhqOqRwjabnjTS0rFMnFyTQEwpqXrTjsUSuh+kA1X6Ff63Zh8L1x3AZjZy+4xMLhqTgtnYdK1LUQN4AhW4A66jawz1koHb78aT5sad6MZzUjiOYoW+2S6kfS6G7FhD8uo19AHCLLAz1cC+NAO/pkNWmhmro24CSA1Pr5Mowi1OnGZnzWPt5BBudmIWH2adQ9Ow5K7CsXU+1uylGNQAAPVXsNEMRjR7LEp1wql+rHlenYziwSwWoWtvogZzDBlc0zR8K5ZhzsmiYk92zX0Rray0TjlDVHStm+hH7ouYUtIwxHafpqz2UBXw8v3+PJ79fguHvOVM6m/j5KERGI3eYNLw1EoW9ROIh0ql+d+TwxR2VM2hfg0h3Owk2q3SZ1chkfJ+bNuzMGbnYNA0MJkwDxmKZdQYzKPHYhk5CmNk22tVx0rUYI7QvF7U4iLU3CxMm7/AIK9AOVyG32vDr/YhUGHAYDSB3YbBZsFoM2K0GjCaVUxmPyZjFUZDJWbcmDQXJrOC0aJitGiYLCpGswbhTrTIeLTwxHpJKAG1Zls8mi0KesD/3c6owXR6gpEk6SbgDiAZ2AbcJsvy8ibK3wz8CegP7APmyrI8v16ZC4A5QCaQBdwny/KHzcVyrAlGLTnM4fN/C5qGMSFRr3XUuReiN2sZnd2zKas9aZrG67++x8Lsf6MZGr//YDaYcVqcjTYdNfR4JJE4CTeHHfNYENXlIrB185FmtR3bwe8HwJSRWTP40zx6DKb4hGN6j2PRWxKMVlGBUlykJ5CiItTiQtTiIpSiItQi/blWXn7UcYZwO8bEVIwJSRjj47HZLHhLytA8HrQKN1pFRfC5B83tBkVpPhgDemKyaJjMAYxmJZiENIxmPSEZbUYMYeEYIiLBGYUhMhai4yE6EWJS0GLT0PqkozkTwWjqgCvWPnpcgpEk6RJgIXATsCL4eA0wTJblfQ2UvxGYB1wPrAUmAq8Al8my/EmwzBRgOfAA8AHwO+BBYJosy2ubiqct92BUt5uYxBjKPP5jOr432FtymLvXzKFIWwsVgzil70wmpyYRaXUeuTcRTBBWo7XL1Oi0Ki+B7dtrOg4Etm5Bq9T/TozJKXVmHDCm9+2wuHtCglE9bj1pBBNFTeKolVDqTy0Eeu3fGB+PJSyAVc3DZijGFGFGk6YRGHcJSFMx2OvOnN3U9dI0DXw+Pdl49H9qredahafOvprn7nI0Vxmax6UnrMoqNF+gRT+70axisBow2kwY7VYMDruemJwRGJyRENkHouIgOhFDRBTGsHAM4eEYwp36Y/XrDmou74kJZi2wWZbl62tt2wW8J8vyPQ2UXwWslWX5L7W2PQFMkmX5+ODrt4E+sizPrFXmG6BYluVZTcXTXbopdzceX4Bn1izj68NPgaWEodYLmTvtRgakxHTL66UFAihZu2q6Rvs3b0IrLQH0wam151QzDRyEwdQ+31q78t+XpmloblewxqEnCqVWEqnerlUc3THC0KcPpvgEjPEJGBMSMSYkYIxP1LclJGAxHiZs59vY5Pcx+t0EYodSOeIqqgafj2ZtvFWgs66XFgigVVYcqSF5PGiuUijJh9ICKDuIVn4YXKVobpe+v9KL6vWhVQVQ/AZUvxE1YACtBV9OLGYMYWHBxOOsSTzG2kmowed6oqpOXNjtdb4M9aib/JIkWYFxwOP1dn0FTG3kMBvgrbetEpgoSZJFlmU/MAV4rl6ZpejNakInCqgaH23O48Wtb6LEfILNEsVdo55iRvqEUIfWJgazGbM0FLM0FMfFs9A0DWVfjj69zeYN+DdvxPfjd3rZsHDMI0bqgz9Hj8E8ZBgGW/eaH0zTNLSysmCiKKzbfBVMIkpxEXjr/dc0GDDGxmGMT8DUvz+WCRP1JuRg4jDGJ2CMi2/4G7lShW33ZzjWzsGS/zOayUbVwLOoHHEVgcTjutQ9D4PZrDePRUS2/mBVweA9jNFThNFTAKX5GA/lQmkBWlkxlB3Sk5WnDNUbqElEir8M1W9ArTCjuK2oATNKwIjq01CrFAiozb+30agnqmDCMd98M0w6ofU/Qyt0ZpeXOMAEFNbbXgic2sgxS4FrJUn6AFiHnqCuAyzB8+UDSY2cM6l9whaao2kay7IO8+yKLRQ5FmLps52RkZOYM/EfRFlDd5O8oxgMBsz9+mPu1x/7OecBoBQW4t+8IZh0NlLxyn/0whaLPsXNqLFYxgSnuAlhN3NNVdHKSuvWOGo1WSnB13VmgAB9FojYOIwJCZgGDsIyZdqRxJGQiDE+EWNsbKsH8hrL9uLYthD7r+9g9B4mENUf99TZeIdejGbvWTMzAGA0oYXFo4TFo8QPb7ycpmHwuTBWFGH2FGKsKMZYUYTRUxh8LNIfK4owVpWhKaAEgjUjvwElYCJgjEYxRKIYnChqGIpmRw1Y9MTkN2B0hnX4jxuKPpX12+QMDWyrNgc9UawKlisE3gDuBGrfsWvNOWuYTAaio4/9IptMxjYd3xNsyS3jX1/uYF3hRiLSF2M3u7htzN+4bMjlR92b6NHXK3oASAPgot8BoJSW4t2wgcpf1lO5fj2VixdSufB1MBqxSRL2447Dcdw47Mcdh7mRtXFae700RUE5fJhAYQGBwkICBYX684JC/XVhIYGiwpoODDXMZsyJiZgTE7GNHFHz3JyYpD8mJWGKjW23pj/UAIZdSzH+8hrGPd+hGUxog88gMO4PaP2nYzMYOZY6X8/7+wqnqe/JGvqHoBLwgrsIg7sAo7sQk7sIi7sAg7sQ3IX6oycLPEUYtCM1HS0wlEB0z6nBHES/HvWvWAJH10AAkGW5EviDJEn/BySi11huAFzB8wEUtOactSmK1qY2267cRt7R8sq8vLAim6U7ColKXImz/xckOpL4+9jHkaKHUlZWedQxvet6WWHsJMxjJxFxLTgrK/Fv21Iz+LPsvfcoe/NNAEzpfWtmG7CMHosxOQWDwVDnemmKos/2UL/GUfsG+sHio3tKWSw19zpMw0ZgOelk/XWw9mGKT9AnMm1ghoNA8B8Arqqj9reW0Z2Pffsi7NvfwuQpQAlPwjPxr3iHXorqDM5WUFa/RbzletffV31x4IwD54jGi6gKhspDmCqKMFQUEz54WlvuwbSoXKclGFmWfZIkrQdmAu/W2jUTeL+ZY/3AAQBJki4FPpVluToVrw6eY169c65qp9CFWsq9fl5bu5+3N+RiNHsYOOIjCpXNnJR8CrePuEssdNUIg8OBdfxErOMnAvrMDoGdO2om8fQt+4Gqz5YAYIyLxzxyFJVmE1V5eXryOHTo6ORhs+n3OxISsIwZG2yqSjhy3yM+AUN0dGh752kqlgMrcGxdgDX7Kwyagq/vibinz8XX/xQxyr4zGU1o4QkEwoNd7R1hUNWxCbmzf7tPAgskSfoJWAn8EUgBXgSQJGk+gCzLVwVfDwYmAWuAGOB2YARwda1zPgMskyTpHuBD4HxgBnB8J/w8vYZfUXl3Yx7/W7OPcm+AacNKyLH8l8MBF38ZcSdnpZ/bZboZdwcGiwXL8JFYho+Ey67U18bZm633Utu0kcD2LWh2O4bYeCzjJtbcJDfVJJEEDBGRXfaaG7wl2H99G/u2hZjL9qLa+1A55gYqh18j1uCSAAAgAElEQVSOGtU/1OEJnaRTE4wsy29LkhQL3I8+0HIrcKYsyznBIn3rHWJCTyoS4Ae+B6bKsry31jlXBWs1/0Qf/5IFXNLcGBihZTRN45udB/n38mxyy7xM7BdJ5sDVfJ73JqmWNOZNfIrMyIGhDrPbMxiNmDMyMWdk4jj/QqAbNvloGuaC9Ti2zseW9RkGpQp/8kTKJ/6VqswzQay22euIqWLEPZhGbTxQxjPL9rA138XAuHB+PzWSpYeeYePhX/hN6hncOvyvOMwtv6na069Xe+su18vgc2Pb+QGOrQswH/oV1eKkasgFVA6/EiV2SKfF0V2uV1fRo8bBCN1HzuEKnl+ezQ+7DxHvtDL7N4NJSMjm0S23UqV4uWvU/ZyWdmaowxRCzHRwu15b2fkhRr8Hf9wIXCc9infQeWDt2auNCi0jEoxQo6TCx39X7+P9zfnYTEb+OK0fF49NYlH2qzy9fiEZEZn8fewc+jr7hzpUIVQClfqAyK3zsRT+og+IHHQulSOuJJAwpksNiBRCTyQYAa9fYdEvubzx0368foXzRiVz/ZR++I2HuGf9LWwv3crZ6edx07BbsYl29F7JVLoH+9aF2He8g7GqlEB0Ju7j/4FXuqBnDogU2oVIML2Yqml8sb2I/6zcS6GriumZsdxywgD6x4axouBHHtv8MCoKs8c8xIyUxiZbEHosxY9171d6F+MDK9CMZqoGnI53xJX4U6eK2orQLJFgeqm1OSU8++MedhZ7GJro5MEzJMalR+NTfDy//Sk+2PsugyOHMHvsQ6SGp4U6XKETGV152Le/iX37YkwVhSjOVDyT7sQ79BLU8MRQhyd0IyLB9DK7D3p4btkeVmWXkBxp459nDmHmkHiMBgO5ngM8tGE2u8plLuh/CddLN2I1WUMdstAZNBXLvh/12krON6Bp+PrNwD3iUXx9Z3TpdU2ErkskmF6i2F3FSytz+GRbAeFWM3+ePoCLx6ZiM+tThHyX9zVPbn0Uk8HEnHGPMi2xY+coEroGQ+Uh7L8uxrHtTUzl+1AdcVSOvUkfEBmZHurwhG5OJJgersKnsODn/Sxcd4CAqnHpcalcM6kv0Q59ynSv4uXf25/ms/1LGB4zkvvHPEiiQ0xE3aNpGpb8n7BvnY8t6wsMqg9fymQ8k++mKuN0ELVWoZ2IBNNDBVSNJVsLeGnlXg5X+Dl1cDw3n9CftGhHTZm9rmzmbJhNtnsPl2Vexe8HXYdZzA3VYxmqyrHJ7+PYthDzYRnVGknliCvwDr8Spc+gUIcn9EDi06SH0TSNFXsO89yybLIPVzAmNZInzhvOiOTIOmWW5n7Os9uewG6y8+iEJ5kQPzmEUQsdyVy8BfvW+dh3foQhUIk/YTSuGY/jHXQOWHrS9PZCVyMSTA/ya6GLZ37cw/r9ZfSNcfDYOcM4aWBsnQkRKwIent76ON/kLWVM7HHcN/ofxNobXo9E6Mb8ldh2L9EHRBZtQjPb8Q46D++IKwkkjA51dEIv0eIEI0lSX6BAlmVfve02IFGW5X3tHZzQMvnlXl5YsZcvfy0i2mHhjpMH8rtRSZhNddf42F2+k4c2/J08zwF+P+g6Lh94NSaD6B3Uk5hKdmPfugC7/B7GqjICMYNwnfAQVdIFaLaet7qo0LW1KMEEZyu+HziukSKfS5L0oCzL7zayX+gALm+A13/ax+JfcjEYDPx+YjpXT0zHaav7a9U0jSX7PuSFX58l0hLJE5OeY3Ts2BBFLbQ7xYdtz1Ls2+ZjzV2NZrRQlXmmPiAyeZIYECmETEtrMDcA8+rXXgBkWa6SJOlR4EbqLiQmdBC/ovLepnxeXZ1DuTfAmcMT+ePUfiRF2o8q6/a7eHzLv1hW8D0T46dw96j7ibaJqT16AmP5fuzb38KxfTHGymKUiHTck+/GO/RStDDR7CmEXksTzFBgRRP7V1F3RUmhA2iaxne7DvL88mwOlHqZ0DeaW0/MQEpoeBXJX0u3M2fDbIq9Rdww5GYuHjALo+HopXGFbkRVsO77AfvW+VhzvgODAV+/U/COuBJf+oliQKTQpbQ0wUQBTXWOtwGRTewX2mhTbhnP/JjNlvxyMuPCePp3I5jaP6bBFQ01TeO97MW8LL9ArC2Opye/wPCYkSGIWmgvBk8Rjl/fxr79TUyuAyhhCVSM/zPeYZehRqSGOjxBaFBLE0w2MAH4tZH9E4G97RGQUNe+kkr+vTyb73YdJC7cyv2/GcRZw5MwGRtuVy/zlfHo5n+ypmglxyeeyB2j7iHCInJ/t6RpWHJXYd+6ANueLzCoAXyp03BPvR/fgNPAZAl1hILQpJYmmA+AuZIkfS3Lcn7tHZIkpQBzgNfbObZerbTCz3/X5PDepnysJgM3TO3HFePTcFgabwLZcngT/9z4AKW+Em4Zdjvn9bugy67ZLjRB07BvexPz1leJPrQL1RZF5chr8A6/AiUmM9TRCUKLtTTBPAqcD+yUJGkhsCO4fShwObAPeKz9w+t9vH6Ftzfk8drafVT6Fc4bmcz1U/sRF954C6WiKSzKWsDru14l2ZHMc1NeZnCU1IlRC+1GVXAuuw/HtoWoKcfhOuUpqgaeBWZH88cKQhfTogQjy7JbkqRpwCPAJUB1N6QSYAFwryzLro4JsXdQNY0vfy3ihRX62izHZ/ThlukDyIhteunZw1WHeGTjQ6w/9DMzkk/l9hF3EW4Ry9V2S4qfiG//gn3XR1QcdzOW0x+iqqwy1FEJwjFr8UBLWZbLgJskSboZiAMMQLEsy1pHBddb/LyvhGd/zGZHkbvO2izNWX/wZx7e+CAVAQ9/HXk3Z6adLZrEuquAl8ilN2Lb+zXuyXdTOe5PRIvfpdDNtXqqmGBCKe6AWHqdrIMenluWzcrswyRF2HjoTInThiRgbOaDRVEDvLH7f7y5+w36Ovvz+KRnGBAh2ua7LZ+HqM//gCV3Fa4TH8Y74qpQRyQI7aKlI/ldQEM1lTJARh+EubQ9A+vJDrqreGlVDku2FhBmNR21NktTiiuL+OfGB9hSsokz0s7iT8P+gkO0z3dbBm8JUZ9ehbloM65Tn6ZKuiDUIQlCu2lpDeZPjWyPBsYBSyRJulCW5U/aJ6yeqcKn8Oa6AyxYtx+/onHx2FSunXxkbZbmrClayb82/ROf6uOe0X9nZurpHRyx0JEMniKiP7kMU8keyk9/CV+G+H0KPUtLb/K/0dR+SZI2APcCIsE0IKBqfLK1gJdW5XDI4+PUwXHcfMKAOmuzNMWv+vmv/CLvZi9iYOQgZo+ZQ7qzbwdHLXQkY/kBopZcislTSNlZb+BPFyuICj1Pe03X/xnw93Y6V4+haRqrskt4dtke9hyqYFRKJI+dM4xRKS0f+JhfkcecDX9nR9l2zu13ATcO+RNWk60DoxY6mqkki6glszD4PZSeu5hA0rhQhyQIHaK9Eowd8LbTuXqEHYUunlmWzbp9paRH23n07KHMGBTXql5ey/K/Z96WRwD4x9i5TE+e0VHhCp3EVLyN6E8uAwyUnvcuStywUIckCB2mvRLMdcDGdjpXt1YQXJvli1+LiLKb+duMTH43OhmLqeWTTPqUKv7z63N8vO8DhkQNY/bYh0gOS+nAqIXOYM5fR9SnV6FZnZSduxglOiPUIQlCh2ppL7JnG9kVhb5GTAYwvb2C6o7cVQFeW7ufxb8cAOCqCelcM+notVmas9+9j4c2zCbLtYuLBsziOumPWIxizqnuzrJ/OVGf/wElPImycxeLCSqFXqGln36NTcVbDnwB/EeW5ez2Cal78SsqH2zK55XVOZR5A5w5LIEbp/VvcG2W5nyd+yVPbZ2H1Wjl4fHzmJwwrQMiFjqbdc+XRC69CSUmk9Jz3kILiw91SILQKVrai0w0/tejaRpfbivgsS93sL/Uy/i+0dw6fQBDEiNafa7KQCXPbX+SLw98xsiY0dw/5kHiHQkdELXQ2Wzye0R8+1cCCaMpO2s+mr35GRoEoadol3swkiSdBFwny/IV7XG+rs4XULnl/S38cqCMAbFhPH3+CKYOaHhtluZku7J4aMNs9rlzuGLg77l64B8wGdvr1pgQSvYtbxCx7D58qdMoO/N/YBVzxAm9yzF/kkmSlARcA/wBGEDTK172KH5VxWkz889zh3NKRh/MjazN0hRN0/j8wCc8t+1Jws1OHpv4NOPiJnRAtEIoONY/j3PNv6jq/xvKT3sBzK1vMhWE7q5VCUaSJCNwFnAtcAZgAh4EXpZluaD9w+uawq1mnjhvONHRYZSWVrT6eI/fw5NbH+X7/G8YFzuBe8Y8QB9bnw6IVOh0mkb4mkcI++UFvIPPx3Xyk2JhMKHXamkvsoHoXZGvBirQp+j/G7AdeK83JZe22lkm89CG+ymoyOfawf/HrMwrMRpa3oVZ6MI0FeeP9+HYtoDK4VfiPnEuiN+t0Iu1tAazHZgPXCTLck1TmCSJRa1aStM0Psx5j5d2PE+UNZonJz/PqD5jQh2W0F7qrOVyE57J94CYbl/o5VqaYHagN4mVSJJULsvy5mN9Q0mSbgLuAJKBbcBtsiwvb6L8ZcCdwGD0btHfAH+rrjVJkvR74LUGDnXIstwlZhdw+ct5bPPDrCxcxuSEadw16j6irKI3UY8R8BK59CZse7+qWctFEARoUf1dluVRwHlABLBMkqTNkiTdEdzd4gXHJEm6BHgGeBgYC6wCvpAkqcGZG4OraC4A3gCGB2MYBrxZr2gFesKq+ddVksu2ki3csOL3rC1axY1D/8zccY+J5NKT+DxEfXo1tr1f4Zo+VyQXQailNSta/gz8LEnSX4BL0XuPmYBXJUl6E/hAluX8Zk5zO/C6LMuvBF/fIknS6cCNwD0NlJ8CHJBl+ang62xJkp4DnqtXTutq94FUTeWdPW/x350vkWhP5JkpLzI0Wsw71ZPUXsul/NRnxFouglDPsaxoWYneJPWapN+EuRaYjV4zafR8kiRZ0deOebzerq+AqY0cthJ4WJKks4FPgVj05PZ5vXIOSZJy0BPeRmC2LMsbWvNztafSqhL+tXkOPxWvYXrSDP428m6cltYPwBS6LrGWiyA0r00j+mRZloE7JUm6Fzi7meJx6AmgsN72QuDURs6/WpKkWehNYo5gvF+j92arKYZem9qE3oR3K7BSkqTRsizvaiogk8lAdHRYM2E3dbzxqOPXF67j3lX3UFZVxj0T7uXCgRcd0wDMnqih69Utle3H/PGF4C5AuXQxYQNOoiN+qh5zvTqJuF6t0xnXqy0DLT9DH72fL8tyAPiwhYfWv2djaGBb9XsMA54F5gBL0e+vzANeAq4CPQkBq2sdswq9FnML8OemAlEU7ZjGsVSrPQ5G0RQW7n6dBbteIyU8jX9PfZzMyEGUlVUe8/l7mmMdN9SVVK/lovk9lJ2ziEDMOOign6knXK/OJK5X67TlesXHt6xFpi01mOnotYqWOggoQFK97QkcXaupdg/wkyzL84KvN0uS5AGWS5J0nyzL++sfIMuyIknSOmBQK2Jrk4PeYh7e9CAbD/3CqSmn8ZcRd+Awi29SPY1Yy0UQWqfTRoHJsuwD1gMz6+2aid6brCFh6EmpturXDbY7SZJkAEYBzXU4aBc/F6/hhhVXs6N0O3eOuo97Rv9dJJceyJy/juiPLkIz2Sj93QciuQhCC7SlBpMD+Ft5zJPAAkmSfkK/gf9HIAV4EUCSpPkAsixfFSz/CfCKJEk3cqSJ7GngF1mW9wWPeQBYA+wCItGbxUah90zrMAE1wHMbn+W17f9jgDOD2WPn0D9iQEe+pRAiYi0XQTg2x5xgZFkecQzHvC1JUixwP3qy2AqcKctyTrBI33rlX5ckKQL4E/AEUAZ8jz7wslo08DJ601sZsAGYLsvyT62Nr6UUNcBf197ClpJNnJV+LjcPuw2bydZRbyeEkFjLRRCOnUHTmh8nKUnSCOAR4HJZlsvr7YsCFgJ3yrL8a4dE2UH8fkU7lptcbr+LB365l4uli5gU3asX8myV7nYTNtRruXS36xVq4nq1Thtv8q8HxjdXrqX3YP4KbK6fXABkWa6uNdxx1FE9lNMSwROTnuO0/mLsQ09l3/IGkd/chj9lMqXnLBILhQnCMWhpgpkGvN/E/g+BE9oejiCEnmP980Qsu4+q/r+h7Kw3xEJhgnCMWnoPJh041MT+w0Ba28MRhBASa7kIQrtqaQ2mFMhsYv+gYBlB6J40FeeP9xL2ywtUDr8S16nPiOQiCG3U0gTzI3BbE/tvA5a1PRxBCAHFT8TXf8axbQEVx92E+8SHxUJhgtAOWtpE9i9gjSRJHwaf7whuHwrcjT6X2JT2D08QOphYy0UQOkyLEowsyxslSboQ+B9Hj7o/BFwcytmLBeGY+DxEfXEt1gMrcE3/J96Rvw91RILQo7RmPZhPJUnqB5wODESfqmUn8JUsy6LzudCtGLylwbVcNlF+6tNUSReGOiRB6HFaNZI/uBZMS2dNFoQuyVBRTPSSyzCVZFF++ov4Ms4IdUiC0CO1OMFIkmRGX2vlMkBCn2J/F/oo/meDU/YLQpdmdOUS9fGlmDwFlJ31Ov50MRODIHSUFiUYSZJs6CtPHg98C/wXvYlsKPr6LGdLknRacMZkQeiSTKV7iPr4Ugw+N6XnLCKQ3OxMF71aZaUHt7sUReke3x0LCw20ZOorQdfY9TKZzDid0TgcbR9g3NIazF3o42DG17+ZL0nSccDHwTJz2hyRIHQA08HtRC+5DND0tVzih4c6pC6tstKDy1VCdHQ8Fou1W6zKajIZURQ11GF0Gw1dL03T8Pt9lJYWA7Q5ybS0s/8s4K8N9RSTZfkX9HnILmtTJILQQcwF64NruVgoPf8DkVxawO0uJTo6HqvV1i2Si9A+DAYDVquN6Oh43O62j51vaYIZQOOLgoG+tkv/NkcjCO3Msn850R/PQrXHUHr+hygxTU1IIVRTlAAWizXUYQghYrFY26VptKUJxgPENrE/FhBdlYUuxbpnKVGfXo0S1ZfS8z9AjRTT5bWGqLn0Xu31u29pglmBvuhXY/6EXosRhC7BJr9P5Jc3EIgfTul576KFJ4Q6JEHodVp6k/9hYJkkSTHAYxyZKmYY+v2X3wKiv6fQJdi3vEHEsvvwpU6j/MxX0azOUIckdKKSkhJeffUl1qxZyaFDB3E6I8jIyOSUU37DY4/NbfLYa665nmuv/b9OirTna+lUMWslSboIvXvyefV2HwYukWV5bXsHJwit5Vj/PM41/6Kq/0zKT/sPmO2hDknoZPfffyder5e7755NWlo6JSWH2bDhF+x2Ox9//GVNuY8+ep/PPlvCK6+8UbPN4QgLRcg9VmumillSa6qYQcHNNVPFSJKULsvy/o4IUhCaVXstl0Hn4TrlKTHdfi/kcrnYtGkDTz31b8aPnwhAUlIyQ4ce3XPQ4QjDaDQSGxvX2WH2Gm2eKkaSpCRJkuYBfwAc7RibILSMpuJcdj+OrfOpHH4l7hPniun2eymHw4HDEcbKlcsYNWoMNpst1CH1ai0dyR8N/Bv4DeBHn7L/OeDv6AMst6EnGEHoXIqfiO9ux77zQyrG3ohnyr0gej91iM+2FbJka0Gnvuc5I5L47fDEFpc3m83cd98DPProXJYs+ZBBgyRGjhzNjBmnMnz4iA6MVGhIa27yTwfeQG8iewqYCYQDZ8iy/GPHhCcITQh4ifzqZmzZS8VaLkKNk046hSlTjmfz5g1s3bqFtWtXs3jxQm644Sauukp8D+5MLU0wvwWukWX5G0mSXgB2A1myLDe1yqUgdByxlkun++3wxFbVJkLJZrMxYcJkJkyYzDXXXM+//jWH//3vZWbNuhKLRdyb6ywtbahOAbYDyLK8B/ACr3RUUILQFIO3lOgls7Dkrqb81KdFchGa1b//ABRFweerCnUovUpLazBG9Hsv1RTEyH0hBMRaLkJTyspKmT37bn7723PIzBxEWFgYO3b8yltvLWDcuAmEh4sxUZ2ppQnGACyUJKk6/duBVyRJqpNkZFk+pz2DE4TaxFouQnMcjjCGDx/Ju+8u5sCB/fj9PuLjE5g58zSuvvraUIfX6xhasn6CJEmvteRksixf0+aIOpHfr2ilpcdeEYuODqMtx/c2bbletddyKTtrfq9YyyWUf18FBTkkJfULyXsfKzFdf+s0d72a+huIj49YDzT7n7ClI/m7VeIQehaxlosgdE9iNJrQpYm1XASh+xIJRuiyxFougtC9iQQjdEliLRdB6P5EghG6HLGWiyD0DCLBCF2KfcsbRH5zK/6UyZSdswjNHhPqkARBOEatmk1ZEDqSWMtFEHoWkWCE0BNruQhCj9TpCUaSpJvQl1lORp/m/zZZlpc3Uf4y4E5gMFAOfAP8TZblglplLgDmAJlAFnCfLMsfNnA6oaups5bLFbinzwWjKdRRCYLQDjr1HowkSZcAz6BP/z8WWAV8IUlS30bKTwMWoC8TMBx9ueZhwJu1ykwB3g5uGxN8fFeSpEkd95MI7UINEPHNbTi2zqdi7I24T3xEJBdB6EE6uwZzO/C6LMvVMzHfIknS6cCNwD0NlJ8CHJBl+ang62xJkp5DX+ys2m3A97Iszw2+nitJ0ozg9lnt/hMI7aPWWi6eSXdRMe5PYqEwoV3MnfsPvvji06O2Dxs2gpdffh2AXbtkFix4nY0bf8HtdhEfn8CoUWO49NIryMwcSH5+HhdddPTUiieccCKPPPLEUfudzggyMwdy3XV/ZOzYcR32s3U3nZZgJEmyAuOAx+vt+gqY2shhK4GHJUk6G/gUiAUuBT6vVWYKdRMOwFJArD7VVdVey+WEOXhHiZmIhPY1fvxEZs9+qM626nVgVq5czv333xks8yCpqemUl5fxww/f8eKLzzFv3jM1xzzxxHMMHDio5rXVWncJ5ur9JSUlvPzyv7njjluZP/9tUlJSO/Cn6z46swYTB5iAwnrbC4FTGzpAluXVkiTNQm/2cqDH+zVwda1iSY2cM6m5gEwmA9HRYS0KvuHjjW06vrcxmYxE23yYProCQ956Ame/gH3UpYi+Yg0L5d9XYaEBk6n7jWIwmYwYDAasVisJCUePn/J6K3nkkQeZNGkK8+Y9XWtPOsOHj8DlcmEyGWt+9piYmAbPU39/QkICd911P+eeezrr1q3l/PMv7JCfr7019Ts2GNr2+Qih6UVWf/pmQwPbAJAkaRjwLPoN/KXoHQPmAS8BVx3LOWtTFK1Ns9WK2ZRbJ9rsxrDwdxhKdlN++kv4+p4B4vo1KpR/X5qmdbuZiatnB66eIb6h+FetWkVpaSmXX351g/vDwsJRFLVmn6qqDZZraL/FYgXA7/d3i2vX3GzKmtb452N8fESL3qMzE8xB9IXK6tcsEji6BlLtHuAnWZbnBV9vliTJAyyXJOk+WZb3AwWtPKcQAkZXLuZPL4fyXLGWSzdl2/Ee9l8Xd+p7eodeStWQ1tcG1q5dzcyZJ9TZdv75FxEVFQVAv34DWnSem2++HqPxyLf8xx9/ltGjxx5VrrKykpdeeh6TycSYMeIeTLVOSzCyLPskSVoPzATerbVrJvB+I4eFoSel2qpfV98RXh08x7xaZWai91ATugBL3loivr4F/G5Kz3mLQPKEUIck9HCjR4/lzjvvq7PN6Yzg008/atV5HnhgLhkZRyZZjY+Pr7O/OgF5vV5iY+O4994HyMwceOyB9zCd3UT2JLBAkqSf0G/g/xFIAV4EkCRpPoAsy9XNX5+gr5x5I0eayJ4GfpFleV+wzDPAMkmS7gE+BM4HZgDHd8pPJDQu4CV87TwcG19GjUwncMUnBOxiRuTuqmrIhcdUmwgFu91OWlr6UdvT0/UFtHJyshk5cnSz50lISGjwPNUeeGAumZkDcTqdREVFH3vAPVSn3sWTZflt9O7D9wMb0ZPAmbIs5wSL9A3+qy7/OnrX5j8BW4H3gF3AubXKrELvWXY1sBn93swlsiyv7eAfR2iCuWgzMe+cSdjGl/AOv4LDl3wNSSNDHZbQy02cOJno6GgWLny9wf0ul6tV50tISCA1NU0kl0Z0+k1+WZZfAF5oZN9JDWyrP+6loePeQ08+QqgpfsLWP0fY+mdRHbGUnr0Qf9+TQh2V0Mv4fD4OHTpYZ5vRaCImJoa77rqf2bPv5o47buXii2eRltaX8vJyli37np07d9Tppiy0jZiLTGg3psM7ifjmNizFm/EOPh/3CXPQ7OKbndD51q37iXPPPb3Otvj4BD788HNOOOEkXnzxNRYufJ2HHvp7zUDL0aPHcuONfw5RxD2TobpLX2/k9yua6KbcDlQFx6ZXCF87D80SjuukR/Bl/vaoYuJ6tU4or1dBQQ5JSf1C8t7Hqrlut0JdzV2vpv4G4uMj1gPjm3sPUYMR2sRYlkPEt7djzV9L1YDTcJ30L7Sw+OYPFAShxxMJRjg2moZ925s4Vz6EZjRRfspTVEkXivnEBEGoIRKM0GpGdz4R3/8N674f8aWdgOvkJ1AjUkIdliAIXYxIMELLaRq2nR/iXD4bg+LDNX0u3hFXgqH7zVklCELHEwlGaBFD5SEifrwHW9bn+JPG4zrlSZTojFCHJQhCFyYSjNAs656lRPxwF4aqctxT7qFyzB/FwmCCIDRLJBihUYaqMpzLH8Auv4c/bjiucxehxA4NdViCIHQTIsEIDbLsX07Ed7dj9BThGX8rFeNvBZM11GEJgtCNiAQj1OWvwLl6Lo4tbxCIGUjpBR8RSDx6enJBEITmiAQj1DDnryPi29swl+2lYvR1eCbfBWZHqMMSBKGbEglGAKWK8J+ewLHhRVRnKqXnvYM/dWqooxKEYzJ37j/44otPATCZTMTGxjF16vHccMPNREZGAnDhhWdTUJDPv//9Sp0FxF599SV++OFbFix4B4DPP/+Ehx9+kHHjJvLMM3Xn6D3++PHMmfMvZszQV3zftWsnr776Itu3b7yxcdEAACAASURBVMPtdhEdHcPQocO45ZbbSUpKJj8/j9df/y+//LKeQ4cOEhsbxymnzOSaa67DZjuycPiyZT/w5ptvkJOTjaIoxMcnMGrUGO6+e3aHXreOIBJML2cu3krEN7diPixTOWwWnmkPoFmdoQ5LENpk/PiJzJ79EIqisHdvNo888hAul4sHH3y4pozVauM//3mOF1/8X5PnMplMbNy4nrVrVzNp0pQGy5SUlHDbbTcyceIUHnvsaaKioigoyGf16hV4PB4AcnL2oqoqf/vb3aSlpZOTs5fHHptLWVkZd92lL462bt1PzJ59F9de+3/8f3t3Hh9Vdf9//JWEJQSCuIAoiIC2H0Vbl6JFxQ0FUat1X1o3VFwQxBXrVsGvKEV/Wq241A2La12LUi2IWhcU0Vp3P2oVXAFlk2BCIJnfH+dOmAwBkszcTJb38/HIIzP3nnvvuYcwnznLPeeSS64gPz+fOXNm8/LLL2anYBqYAkxLVbmSov9MoGjWDVQWbsCSA++lvOc+uc6VSFa0adOGDTfcCIAuXTZmwICBVbWapIMPPpTJk5/g3/9+nj33HLDWcw0e/BtuvfUv7LTTr6stoZz03nvvsHTpUi655Apat24NwCabbMoOO6xaPrlfv13p129Vy0C3bt054YSTufPO26oCzKuvvkyfPttywgknV6XbbLMe9O/fNJcY1yPYLVDBos/o9NhvaT/zWpZvcSCLjp2u4CLN1jfffM3Mma/RqlX179NdumzMEUccxW233czKlSvXeo6TTx7KN998zdSpz9S4f4MNNqSyspIXXphOXWaoX7ZsGcXFxdXO8+WXs/n0009qfY7GTDWYliRRSbt376b9a9eQaF3Ekv1uo3zL3+Q6V9JETP36GZ75+ul1J8yi/bv/hkHd96/zcTNnvsbAgbtTUVFJeflyAEaMOHe1dMcdN4SnnvoHTz/9JIccsubloNdffwOOPfY47rzzNgYMGEibNtWH7G+77S84/vghjB17Bddf/ye23roPO+zwKwYN2p+uXTep8Zxz587loYcmcfzxQ6q2HXHE0bz77tsMGfI7unTZmD59tqFv350ZNOgAioqK6lwOuaYaTAuR/+NXrPfkUXR4ZTTlm+3OwmOmK7hIs7Xddjtwzz0PcMcd93LEEUezyy67ccQRx6yWrmPHjhx//Encc88dlJaWrvWcxxxzHOXl5Tz++N9r3H/66WcxefK/GDXqUnr33pKnn/4Hxx13JG+++cZqaRcuXMD55w+nb99fc/TRv6/a3q5dO6699kYefvhJhgwZSocOxdx22wSOP/4oFi5cUMdSyD3VYJq7RILCjx6k/StjgDyW7n0dZVsfrWn1pc4Gdd+/XrWJXCgsLKR7980AOOecCxkx4nQmTryTU045fbW0hx9+NI899ncefvj+tZ6zqKiIk046lTvvvI0DD/xtjWnWW68TAwbsy4AB+3LGGcMZMuT3TJx4J3377lyVZsGCHxg58kx69dqCyy+/krwa/i9269adbt26c9BBh3DCCSdz7LGH8cQTj9aY/8ZMNZhmLH/ZXDpOOZHiF0axsst2LDrmOcr6HKPgIi3OkCFDuf/+v/HDD9+vtq9t27aceuoZPPDAJBYvXrzW8xx88KF07Lge9903cZ3XbN26Nd26datWM/rhhx8YMeJ0Nt+8J6NHj12tX6gmm2yyKYWFheusYTVGqsE0U20//Qcd/n0JeSvLKOk/htJfDtG0+tJi7bhjX3r16s3EiXdxwQV/WG3/fvsdwEMP3ceUKZPp1q3bGs/TqlUrTj99GFdddUW17a+++jLTp09ln30GsdlmPYAEr7zyMq+/PoOTTz4NgB9++J7hw09no4024uyzz2fJklXBrFOn9SkoKOCuu25n+fIy+vXbja5dN6GkZCmPPvowpaWlTXIkmQJMM5NXupAOL11K4WdPsWLjHVi6z5+pWH+LXGdLJOeOPvr3XHPNGI477sTV9uXn53PGGSO48MKR6zzP3nvvy4MP3seHH75fta1nz160a9eOCRP+zPz58ygoKGCTTbpx1lkjOfLIYwF4443X+frrL/n66y85/PDq/Z+PPDK5aljz448/wtixo1m0aCFFRe3p1as348Zdz/bb75hhCTS8vLoMqWtuVqyoSCxe/FO9j+/UqYhMjs+2NrOfo/j5C8lbvphlO59P6Q5nQH7j+Q7R2Mqrsctlec2dO4euXTfPybXrq6Agn4qKylxno8lYV3mt7W+gc+fit4C+67pG4/n0kXrLK19K+1dG0+6jh1m54db8ePD9VGzUJ9fZEpEWTgGmiWv99asUTz+P/GXf8dOOw1m287lQ0DbX2RIRUYBpslaU0v71ayh6925WrteLxYc9wcquv1r3cSIiDUQBpglqNfctiqefS6vFn/PTL09mWb+LobWm1ReRxkUBpimpKKdo1g0U/WcCle03YfFvH2ZF991ynSsRkRopwDQRBT98SMfnRtJqwUeUbnU0y/pfQaJtx1xnS0RkjRRgGrvKlbR7+zbav/H/SLTtxJID7qG818Bc50pEZJ0UYBqxgsWfU/zcObSe9x/KtvgNJXteTaLdBrnOlohIrSjANEaJSgrfm0iH164mUdCWHwfezPKf/VZziIlIk6IA08jk//g1xc+fT5tvXmV5j70pGXAtle275jpbIlIHw4efRu/eW3DeeRflOis5pQDTWCQStP3473R4+QogwdK9x1O29bGqtYjUw8KFC7jvvonMmPEK8+fPo6ioPd27b8a++w7igAMObjSLd33zzdf87W93M2vWTBYtWsiGG27EVlttzdFH/55f/GK7XGcvYwowjUDesvkUv3gRbWdPo3zTfizd53oqO/bIdbZEmqTvvvuWM888hfbt23PqqWewxRY/I5Go5KuvvuTZZ6fQsWMnBg0avNpxK1asoHXr1g2Wz48//pCRI89k8817cd55F9GrV29KS0t57bVXuOGGa7n77vsaLC9xafAAY2bDgAuBTYAPgHPc/eU1pJ0IrD71Kfzk7u2jNHsBL9SQZmt3/zgbeY5Tm8+epvjfF5O34idKdruC0u1O0bT6Ihm47rpx5Ofnc+edk2jXbtUDyL17b8meew4gOcFv//59OffcUbz11izeeOM1DjnkCM48cwTjx4/lP/95kwULFtClSxcOOugQjj32ePLzw//LsWNHs2TJYvr02ZbHHvs7ZWWl7L33vpx//kW0bVtYdb3KygS33z6ByZMfJy8vn8GDD2TYsLPJz88nkUgwduxoNt20G7feehcFBQVVx2255c+qLd/8v/99xk03Xc97771D27Zt6d9/D0aOvIAOHTpUy0/fvr/mgQf+RllZGXvssRfnnXcRhYWFPPnkY9x11+088cQ/q60/88c/XkJp6U+MG3d9PP8QNPCCY2Z2NHAjcDWwAzADeMbM1vR1fSQhEKX+fA7UtGbpNmnpPs1q5rMsr2wRxVPPYr1/nUFFxx4sOupZSrcfquAikoEff1zCG2+8xqGHHlktuKRKXUHynnvuYJddduPeex/isMOOJJFI0LlzF6688hruv/8Rhg4dxqRJ9/DPf06udo633/4Pn332KTfeeAtXXTWeN954nVtv/Uu1NNOmPUNBQQG33no35547ikceeZDp06cC8OmnzhdffM6xx55QLbgkFRcXA1BWVsb554+gqKgdd9xxL1dffS3vvfcu11wzplr6d955my+++B9//vMtXHnlNbz00gs88siDAAwYMJCSkqXVlm4uLS3l5ZdfZNCgA2pbtPXS0DWY84CJ7n5H9H6EmQ0GzgQuTk/s7kuAJcn3ZrYb0Bs4voZzz3f3H7Kf5exrM+d5Ojx/IfllC1j26wv5acezGtW0+iI1KXt2CmVTnmrQaxYeeBCFgw+sdfqvvvqKRCJBjx7Vp5k/9NADKClZCsCgQftz4YWXALDPPgM56KBDqqU99dQzql5vssmmfPLJx0ybNpXf/GZVuoKCfC655AqKioro3XtLzjxzBOPG/R+nnz68KrD17Nm76lw9emzOU089wVtvzWLgwMF89dVXUZqea72fqVOfobT0Jy6//EqKitoDMGrUJZx99hl8/fVXVctCt2/fgfPP/wOtWrWiZ89e7L33vrz55iyOP34IHTt2pF+/3Zg27Rn69dsVgJdeeoGCglbsttvutS7b+miwTzUzawP8CrgubddUYNdanmYo8IG7z6hh35tm1hb4ELjK3WtqNsupvPIS2r96Je0+fICVGxiLf3MvKztvm+tsiTR7EybcQWVlJePHj6W8vLxq+1Zbrb6sxZNPPspTT/2DefO+Y/ny5axcuZKNN96kWpottvhZtYEC2277S1asWME3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\n",
      "text/plain": [
       "<Figure size 432x648 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize=(6,9))\n",
    "plt.rcParams['font.size'] = 14\n",
    "\n",
    "x = [1, 2, 3, 4, 5]\n",
    "y00 = [0.85862067, 0.90392176, 0.95300735, 0.95516617, 0.93931837]\n",
    "y01 = [0.04724516, 0.04547115, 0.02137438, 0.01550607, 0.0312619 ]\n",
    "y10 = [0.74022413, 0.7962287,  0.87348057, 0.90701257, 0.89906024]\n",
    "y11 = [0.04772464, 0.08154395, 0.05527435, 0.03429202, 0.02307766]\n",
    "y20 = [0.8434636,  0.90431754, 0.9092739,  0.94782841, 0.95828293]\n",
    "y21 = [0.04018736, 0.044927,   0.03594954, 0.0189617,  0.02197666]\n",
    "y30 = [0.90465768, 0.9158698,  0.8962559,  0.90527957, 0.90081494]\n",
    "y31 = [0.039465,   0.0429603,  0.04615946, 0.04302689, 0.03747349]\n",
    "\n",
    "ax = fig.add_subplot(2, 1, 1)\n",
    "ax.plot(x, y00 ,label='ST')\n",
    "ax.plot(x, y10 ,label='ECFP')\n",
    "ax.plot(x, y20 ,label='RNNS2S')\n",
    "ax.plot(x, y30 ,label='GraphConv')\n",
    "ax.set_xticks(x)\n",
    "ax.set_xlabel('Stratified SMILES length')\n",
    "ax.set_ylabel('ROC-AUC')\n",
    "ax.legend()\n",
    "ax.grid()\n",
    "\n",
    "ax = fig.add_subplot(2, 1, 2)\n",
    "df = pd.read_csv('data/bbbp.csv')\n",
    "ax.hist(list(map(len, df['smiles'].values)), bins=20)\n",
    "ax.set_xlabel('SMILES length')\n",
    "ax.set_ylabel('Counts')\n",
    "ax.grid()\n",
    "\n",
    "plt.savefig('strat.png', dpi=300)\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/honda/anaconda3/envs/deepchem/lib/python3.5/site-packages/matplotlib/figure.py:459: UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure\n",
      "  \"matplotlib is currently using a non-GUI backend, \"\n"
     ]
    },
    {
     "data": {
      "image/png": "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Kdc+F97b29V2nr+/RxG9paRK8mdT3v76d6EyqEx5K1NWqFx5K1NWKJ281/O1WgW1VCoF5kvf8RI5zfSIt0hV9vDDocydO5OBAx8rdMzOzo7hw0czYcKYIsfp2vVO3nxzPT///JOtrUGDhri4uLB06UucOxeP2Wymdu26jBo1hgcffASAb7/9hlOnTnDq1An697+7wJjvvvuxbZut999/l9mzZ5CcfB5XVzcaNmzEvHmLuPXWYKRs1KtXD39/f2JjY2ndujUAOTk57N27l4iICACCgoLIzMwkLi7ONo86Li6OzMxMgoKCDMsuIiJVhwpqqTScDr2PxxcTyHfxIeX+98mrGWh0JBEpJVOmzLhse48evejRoxcA7723udDxjh1D+OqrvQXaevfuS+/efQv1XbHijQKv69atx4QJk6+a60pj/VVwcFuCg9tetY+UTEZGBidOnAAgPz+f06dP88svv+Dl5UWdOnUYNGgQ0dHRNGrUiAYNGrBs2TJcXV25++5Lv/wICAigS5cuREZG8txzz2G1WomMjKRr165akExEREqFCmqp+PLzcIudjesPK8mt04G0nss1X1pEpBr46aefGDTo/7dOe+WVV3jllVfo168f8+bNY8iQIeTk5DBr1ixSU1MJDAxk9erVtj2oARYuXEhUVBRPPPEEAN26dWP69Onlfi0iIlI1qaCWCs2Udf5/86V3k9kqnIyQ6ZovLSJSTXTo0IFDhw5d8bjJZGL06NGMHj36in28vb1ZuHBhWcQTERFRQS0Vl33CT3h+Mhi7zATS7niRnGYPGh1JRERERETERgW1VEhOv35wab60cw1S+m0i74ZbjY4kIiIiIiJSgApqqVjy83CLnYPrDyv+N186Gqurf9HniYiIiIiIlDMV1AbYsGEDq1atIiEhgcaNGzN58mTatr38CrGTJk3igw8+KNTu4uLC/v37AdizZ0+BRVv+tG3bNgICAko3fBkyZZ3Hc8dIHE99pfnSIiIiIiJS4amgLmfbtm1jzpw5REZG0qZNGzZu3MiQIUPYunUrderUKdR/ypQpjBs3rkDbI488Qrt27Qr13bp1K15eXrbXPj4+pX8BZcSccBCvT568NF+62yJymj9kdCQREREREZGrsjM6QHXz+uuv069fPx566CECAgKYNm0a/v7+vPnmm5ft7+Hhgb+/v+2/EydOcPLkSR58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PZEYeIWaiKgGOXr0qOJqRGxsLEJDQ9GsWTO0bNlS7GhERFQDhYeHw97eHrVr18bly5exZs0aDBgwgMU0VRksqImIapC0tDQsXboUT548Qa1atdCuXTvMnDmzTE9ZJSIiKq1///0X69atQ3JyMurUqQNvb2+MGzdO7FhExcYh30RERERERESlwLEURERERERERKXAgpqIiIiIiIioFFhQExEREREREZUCC2oiIiIiIiKiUmBBTURERERERFQKLKiJiIiIiIiISoEFNREREREREVEpsKAmIiIiIiIiKgUW1ERERERERESlwIKaiIiIiIiIqBRYUBMRERERERGVAgtqIiIiIiIiolJgQU1ERERERERUCiyoiYiIiIiIiEqBBTURERERERFRKbCgJiIionK1fv16DBo0CM7Ozmjfvj38/Pxw+/ZtpTYBAQGwtbVV+vrwww+V2mRnZ+PLL79Eu3bt0KpVK/j5+eG///5TavP48WP4+fmhVatWaNeuHRYuXIjs7GylNmfPnsXAgQNhb2+Prl27IiIiomI2nIiIahx1sQMQERFR9XL27Fl88sknsLe3hyAIWLFiBXx9fXH48GEYGhoq2nXo0AFhYWGK7zU0NJSWExwcjD/++APLli2DoaEhQkNDMWbMGOzduxdSqRRyuRxjxoyBoaEhwsPDkZycjBkzZkAQBMyePRsA8PDhQ4wePRqDBg3CkiVLcOHCBcyfPx9GRkbw9PSsnA4hIqJqSyIIgiB2CCIiIqq+0tLS0KZNG6xevRoeHh4AXl6hTkpKwvr16wudJyUlBS4uLli0aBHef/99AMCTJ0/QpUsXbNy4Ee7u7vjzzz8xZswY/O9//0PdunUBAPv370dQUBDOnDkDPT09LFmyBEePHsVvv/2mWPasWbNw9+5dfPfddxW85UREVN1xyDcRERFVqLS0NOTl5aFWrVpK0y9cuAAXFxd4enoiKCgIiYmJis+uXr2KnJwcuLm5KabVrVsXNjY2iI6OBgBcunQJNjY2imIaANzd3ZGdnY2rV68q2ri6uiqt183NTbF8IiKisuCQ7xouLy8PcnnZBilIpZIyL4MKx76tGOzXisO+rRjl1a8aGtJySFNywcHBaN68OZycnBTT3N3d0b17d1haWiI2NhbLly/HsGHDsHfvXshkMiQkJEAqlaJ27dpKyzI2NkZCQgIAICEhAcbG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\n",
      "text/plain": [
       "<Figure size 1080x864 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize=(15,12))\n",
    "plt.rcParams['font.size'] = 14\n",
    "#plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, )\n",
    "\n",
    "x = [1, 2, 3, 4, 5]\n",
    "y00 = [0.85862067, 0.90392176, 0.95300735, 0.95516617, 0.93931837]\n",
    "y01 = [0.04724516, 0.04547115, 0.02137438, 0.01550607, 0.0312619 ]\n",
    "y10 = [0.74022413, 0.7962287,  0.87348057, 0.90701257, 0.89906024]\n",
    "y11 = [0.04772464, 0.08154395, 0.05527435, 0.03429202, 0.02307766]\n",
    "y20 = [0.8434636,  0.90431754, 0.9092739,  0.94782841, 0.95828293]\n",
    "y21 = [0.04018736, 0.044927,   0.03594954, 0.0189617,  0.02197666]\n",
    "y30 = [0.90465768, 0.9158698,  0.8962559,  0.90527957, 0.90081494]\n",
    "y31 = [0.039465,   0.0429603,  0.04615946, 0.04302689, 0.03747349]\n",
    "\n",
    "ax = fig.add_subplot(2, 2, 1)\n",
    "# ax.errorbar(x, y00, y01, label='ST', fmt='o-')\n",
    "# ax.errorbar(x, y10, y11, label='ECFP', fmt='.--')\n",
    "# ax.errorbar(x, y20, y21, label='RNNS2S', fmt='v-.')\n",
    "# ax.errorbar(x, y30, y31, label='GraphConv', fmt='^:')\n",
    "ax.plot(x, y00 ,label='ST')\n",
    "ax.plot(x, y10 ,label='ECFP')\n",
    "ax.plot(x, y20 ,label='RNNS2S')\n",
    "ax.plot(x, y30 ,label='GraphConv')\n",
    "ax.set_xticks(x)\n",
    "ax.set_xlabel('Stratified SMILES length')\n",
    "ax.set_ylabel('ROC-AUC')\n",
    "ax.legend()\n",
    "ax.grid()\n",
    "\n",
    "ax = fig.add_subplot(2, 2, 2)\n",
    "df = pd.read_csv('data/bbbp.csv')\n",
    "ax.hist(list(map(len, df['smiles'].values)), bins=20)\n",
    "ax.set_xlabel('SMILES length')\n",
    "ax.set_ylabel('Counts')\n",
    "ax.grid()\n",
    "\n",
    "\n",
    "y00 = [0.68408001, 0.71874454, 0.72072563, 0.75484625, 0.84941198]\n",
    "y01 = [0.0418942,  0.03758716, 0.03403227, 0.02725244, 0.02363938]\n",
    "y10 = [0.7087033,  0.76279766, 0.79429214, 0.7742506,  0.88217889]\n",
    "y11 = [0.04014194, 0.04618025, 0.02731838, 0.04298497, 0.02132686]\n",
    "y20 = [0.65276065, 0.65089961, 0.66376145, 0.72666168, 0.8337165 ]\n",
    "y21 = [0.05214281, 0.05239721, 0.03849954, 0.03402176, 0.02286239]\n",
    "a = np.array(\n",
    "[[1.        , 0.83950617, 0.8961039 , 1.        , 0.66666667],\n",
    " [0.81730769, 0.87719298, 0.71308017, 0.94285714, 1.        ],\n",
    " [0.96794872, 0.98441558, 0.525     , 0.4556962 , 0.99375   ],\n",
    " [0.9038961 , 0.675     , 0.96474359, 0.56875   , 0.81418919],\n",
    " [0.91983122, 0.975     , 0.9535865 , 1.        , 0.7257384 ],\n",
    " [0.95061728, 0.8375    , 0.54375   , 0.66666667, 0.49038462],\n",
    " [0.95061728, 0.72190476, 1.        , 0.98961039, 0.97530864],\n",
    " [0.57142857, 0.74683544, 0.91346154, 0.12345679, 0.85897436],\n",
    " [0.76623377, 1.        , 0.56140351, 0.9775641 , 0.72987013],\n",
    " [0.91025641, 0.01234568, 0.82051282, 0.98125   , 0.40625   ],\n",
    " [0.97468354, 0.66666667, 0.9875    , 0.95512821, 0.88888889],\n",
    " [0.90705128, 0.575     , 1.        , 0.96153846, 0.74038462],\n",
    " [1.        , 0.94375   , 0.58333333, 0.86605784, 0.71929825],\n",
    " [0.7875    , 0.98441558, 0.66987179, 0.9125    , 0.94375   ]])\n",
    "y30 = np.mean(a, axis=0)\n",
    "y31 = np.std(a, axis=0)\n",
    "\n",
    "ax = fig.add_subplot(2, 2, 3)\n",
    "# ax.errorbar(x, y00, y01, label='ST', fmt='o-')\n",
    "# ax.errorbar(x, y10, y11, label='ECFP', fmt='.--')\n",
    "# ax.errorbar(x, y20, y21, label='RNNS2S', fmt='v-.')\n",
    "# ax.errorbar(x, y30, y31, label='GraphConv', fmt='^:')\n",
    "ax.plot(x, y00 ,label='ST')\n",
    "ax.plot(x, y10 ,label='ECFP')\n",
    "ax.plot(x, y20 ,label='RNNS2S')\n",
    "ax.plot(x, y30 ,label='GraphConv')\n",
    "ax.set_xticks(x)\n",
    "ax.set_xlabel('Stratified SMILES length')\n",
    "ax.set_ylabel('ROC-AUC')\n",
    "ax.legend()\n",
    "ax.grid()\n",
    "\n",
    "ax = fig.add_subplot(2, 2, 4)\n",
    "df = pd.read_csv('data/hiv.csv')\n",
    "ax.hist(list(map(len, df['smiles'].values)), bins=20)\n",
    "ax.set_xlabel('SMILES length')\n",
    "ax.set_ylabel('Counts')\n",
    "ax.grid()\n",
    "\n",
    "fig.text(0.02, 0.7, 'BBBP', ha='center', va='center', rotation='vertical', fontsize=16)\n",
    "fig.text(0.02, 0.3, 'HIV', ha='center', va='center', rotation='vertical', fontsize=16)\n",
    "plt.savefig('strat.png', dpi=300)\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_inputs(sm):\n",
    "    seq_len = 220\n",
    "    sm = sm.split()\n",
    "    if len(sm)>218:\n",
    "        print('SMILES is too long ({:d})'.format(len(sm)))\n",
    "        sm = sm[:109]+sm[-109:]\n",
    "    ids = [vocab.stoi.get(token, unk_index) for token in sm]\n",
    "    ids = [sos_index] + ids + [eos_index]\n",
    "    seg = [1]*len(ids)\n",
    "    padding = [pad_index]*(seq_len - len(ids))\n",
    "    ids.extend(padding), seg.extend(padding)\n",
    "    return ids, seg\n",
    "\n",
    "def get_array(smiles):\n",
    "    x_id, x_seg = [], []\n",
    "    for sm in smiles:\n",
    "        a,b = get_inputs(sm)\n",
    "        x_id.append(a)\n",
    "        x_seg.append(b)\n",
    "    return torch.tensor(x_id), torch.tensor(x_seg)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [],
   "source": [
    "from rdkit import Chem\n",
    "from rdkit.Chem import AllChem\n",
    "\n",
    "def bit2np(bitvector):\n",
    "    bitstring = bitvector.ToBitString()\n",
    "    intmap = map(int, bitstring)\n",
    "    return np.array(list(intmap))\n",
    "\n",
    "def extract_morgan(smiles, targets):\n",
    "    x,X,y = [],[],[]\n",
    "    for sm,target in zip(smiles,targets):\n",
    "        mol = Chem.MolFromSmiles(sm)\n",
    "        if mol is None:\n",
    "            print(sm)\n",
    "            continue\n",
    "        fp = AllChem.GetMorganFingerprintAsBitVect(mol, 2, 1024) # Morgan (Similar to ECFP4)\n",
    "        x.append(sm)\n",
    "        X.append(bit2np(fp))\n",
    "        y.append(target)\n",
    "    return x,np.array(X),np.array(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Total parameters: 4245037\n",
      "Total parameters: 4713517\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "from pretrain_trfm import TrfmSeq2seq\n",
    "from pretrain_rnn import RNNSeq2Seq\n",
    "from build_vocab import WordVocab\n",
    "from utils import split\n",
    "\n",
    "pad_index = 0\n",
    "unk_index = 1\n",
    "eos_index = 2\n",
    "sos_index = 3\n",
    "mask_index = 4\n",
    "\n",
    "vocab = WordVocab.load_vocab('data/vocab.pkl')\n",
    "\n",
    "trfm = TrfmSeq2seq(len(vocab), 256, len(vocab), 3)\n",
    "trfm.load_state_dict(torch.load('.save/trfm_12_23000.pkl', map_location=torch.device('cpu')))\n",
    "trfm.eval()\n",
    "print('Total parameters:', sum(p.numel() for p in trfm.parameters()))\n",
    "\n",
    "rnn = RNNSeq2Seq(len(vocab), 256, len(vocab), 3)\n",
    "rnn.load_state_dict(torch.load('.save/seq2seq_1.pkl', map_location=torch.device('cpu')))\n",
    "rnn.eval()\n",
    "print('Total parameters:', sum(p.numel() for p in rnn.parameters()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def evaluate_mlp_classification(X, y, n_repeats):\n",
    "    rate = 0.8\n",
    "    auc = np.empty(n_repeats)\n",
    "    for i in range(n_repeats):\n",
    "        clf = MLPClassifier(max_iter=1000)\n",
    "        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1-rate, stratify=y)\n",
    "        clf.fit(X_train, y_train)\n",
    "        y_score = clf.predict_proba(X_test)\n",
    "        auc[i] = roc_auc_score(y_test, y_score[:,1])\n",
    "    ret = {}\n",
    "    ret['auc mean'] = np.mean(auc)\n",
    "    ret['auc std'] = np.mean(np.std(auc, axis=0))\n",
    "    return ret"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2050, 4)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>num</th>\n",
       "      <th>name</th>\n",
       "      <th>p_np</th>\n",
       "      <th>smiles</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>Propanolol</td>\n",
       "      <td>1</td>\n",
       "      <td>[Cl].CC(C)NCC(O)COc1cccc2ccccc12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>Terbutylchlorambucil</td>\n",
       "      <td>1</td>\n",
       "      <td>C(=O)(OC(C)(C)C)CCCc1ccc(cc1)N(CCCl)CCCl</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>40730</td>\n",
       "      <td>1</td>\n",
       "      <td>c12c3c(N4CCN(C)CC4)c(F)cc1c(c(C(O)=O)cn2C(C)CO...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>24</td>\n",
       "      <td>1</td>\n",
       "      <td>C1CCN(CC1)Cc1cccc(c1)OCCCNC(=O)C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>cloxacillin</td>\n",
       "      <td>1</td>\n",
       "      <td>Cc1onc(c2ccccc2Cl)c1C(=O)N[C@H]3[C@H]4SC(C)(C)...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   num                  name  p_np  \\\n",
       "0    1            Propanolol     1   \n",
       "1    2  Terbutylchlorambucil     1   \n",
       "2    3                 40730     1   \n",
       "3    4                    24     1   \n",
       "4    5           cloxacillin     1   \n",
       "\n",
       "                                              smiles  \n",
       "0                   [Cl].CC(C)NCC(O)COc1cccc2ccccc12  \n",
       "1           C(=O)(OC(C)(C)C)CCCc1ccc(cc1)N(CCCl)CCCl  \n",
       "2  c12c3c(N4CCN(C)CC4)c(F)cc1c(c(C(O)=O)cn2C(C)CO...  \n",
       "3                   C1CCN(CC1)Cc1cccc(c1)OCCCNC(=O)C  \n",
       "4  Cc1onc(c2ccccc2Cl)c1C(=O)N[C@H]3[C@H]4SC(C)(C)...  "
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_csv('data/bbbp.csv')\n",
    "print(df.shape)\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.hist(list(map(len, df['smiles'].values)), bins=20)\n",
    "plt.xlabel('SMILES length')\n",
    "plt.ylabel('counts')\n",
    "plt.title('BBBP')\n",
    "plt.grid()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### ST"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "SMILES is too long (256)\n",
      "SMILES is too long (239)\n",
      "SMILES is too long (258)\n",
      "SMILES is too long (380)\n",
      "SMILES is too long (332)\n",
      "There are 2050 molecules. It will take a little time.\n",
      "(2050, 1024)\n"
     ]
    }
   ],
   "source": [
    "x_split = [split(sm) for sm in df['smiles'].values]\n",
    "xid, _ = get_array(x_split)\n",
    "X = trfm.encode(torch.t(xid))\n",
    "print(X.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2050, 1026)"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l = np.array([len(smiles) for smiles in df['smiles'].values]).reshape((-1,1))\n",
    "y = df['p_np'].values.reshape((-1,1))\n",
    "data = np.hstack([X, y, l])\n",
    "data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.85862067 0.90392176 0.95300735 0.95516617 0.93931837]\n",
      "[0.04724516 0.04547115 0.02137438 0.01550607 0.0312619 ]\n",
      "[[0.83482714 0.89649924 0.91309524 0.97458791 0.88372093]\n",
      " [0.85339367 0.82939189 0.94825871 0.94181034 0.96536797]\n",
      " [0.92317542 0.93759513 0.96927017 0.97348485 0.9222488 ]\n",
      " [0.95273109 0.8952381  0.96517413 0.96969697 0.92486583]\n",
      " [0.92619048 0.86171575 0.95483193 0.94274194 0.91309524]\n",
      " [0.86486486 0.92541857 0.96716418 0.96296296 0.99342105]\n",
      " [0.88809524 0.92573624 0.97055058 0.96767241 0.85330948]\n",
      " [0.77369008 0.86403509 0.95721393 0.92954545 0.93872695]\n",
      " [0.84886878 0.92727273 0.9632107  0.94917582 0.95833333]\n",
      " [0.81714286 0.83994878 0.94166667 0.95382669 0.94504831]\n",
      " [0.8361204  0.95522388 0.96209588 0.97577277 0.93633634]\n",
      " [0.87068004 0.87519026 0.95483193 0.93265993 0.92218137]\n",
      " [0.82142857 0.90138889 0.92736486 0.93390805 0.96660704]\n",
      " [0.8625     0.98055556 0.95902689 0.93298634 0.96216216]\n",
      " [0.7900128  0.87323944 0.94285714 0.95578947 0.94736842]\n",
      " [0.78233035 0.96623377 0.98975672 0.96498316 0.92903995]\n",
      " [0.8797619  0.96571429 0.90238095 0.94841562 0.94156231]\n",
      " [0.84726867 0.88333333 0.95738204 0.9691092  0.96183661]\n",
      " [0.89966555 0.8297619  0.92962185 0.975      0.9794686 ]\n",
      " [0.89966555 0.94494238 0.98439242 0.94919355 0.94166667]]\n"
     ]
    }
   ],
   "source": [
    "scores = np.zeros((20,5))\n",
    "for i in range(20):\n",
    "    data_train, data_test = train_test_split(data, test_size=0.2, stratify=data[:,-2])\n",
    "    clf = MLPClassifier(max_iter=1000)\n",
    "    clf.fit(data_train[:,:-2], data_train[:,-2])\n",
    "    arg =  np.argsort(data_test[:,-1])\n",
    "    data_list = np.array_split(data_test[arg], 5, axis=0)\n",
    "    for j,d in enumerate(data_list):\n",
    "        y_score = clf.predict_proba(d[:,:-2])\n",
    "        scores[i, j] = roc_auc_score(d[:,-2], y_score[:,1])\n",
    "print(np.mean(scores, axis=0))\n",
    "print(np.std(scores, axis=0))\n",
    "print(scores)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### ECFP"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "O=N([O-])C1=C(CN=C1NCCSCc2ncccc2)Cc3ccccc3\n",
      "c1(nc(NC(N)=[NH2])sc1)CSCCNC(=[NH]C#N)NC\n",
      "Cc1nc(sc1)\\[NH]=C(\\N)N\n",
      "s1cc(CSCCN\\C(NC)=[NH]\\C#N)nc1\\[NH]=C(\\N)N\n",
      "c1c(c(ncc1)CSCCN\\C(=[NH]\\C#N)NCC)Br\n",
      "n1c(csc1\\[NH]=C(\\N)N)c1ccccc1\n",
      "n1c(csc1\\[NH]=C(\\N)N)c1cccc(c1)N\n",
      "n1c(csc1\\[NH]=C(\\N)N)c1cccc(c1)NC(C)=O\n",
      "n1c(csc1\\[NH]=C(\\N)N)c1cccc(c1)N\\C(NC)=[NH]\\C#N\n",
      "s1cc(nc1\\[NH]=C(\\N)N)C\n",
      "c1(cc(N\\C(=[NH]\\c2cccc(c2)CC)C)ccc1)CC\n",
      "2039 2039\n"
     ]
    }
   ],
   "source": [
    "x,X,y = extract_morgan(df['smiles'].values, df['p_np'].values)\n",
    "print(len(X), len(y))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2039, 1026)"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l = np.array([len(smiles) for smiles in x]).reshape((-1,1))\n",
    "y = y.reshape((-1,1))\n",
    "data = np.hstack([X, y, l])\n",
    "data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.74022413 0.7962287  0.87348057 0.90701257 0.89906024]\n",
      "[0.04772464 0.08154395 0.05527435 0.03429202 0.02307766]\n",
      "[[0.79004525 0.85307018 0.78361076 0.90755008 0.92378049]\n",
      " [0.74247492 0.71794872 0.88182832 0.90673077 0.87743902]\n",
      " [0.78082192 0.79166667 0.92701665 0.93478261 0.88231707]\n",
      " [0.80121528 0.71491228 0.92142857 0.8633157  0.93772894]\n",
      " [0.81791045 0.79166667 0.80833333 0.86825886 0.89378882]\n",
      " [0.7047619  0.7875     0.91722973 0.93478261 0.90697674]\n",
      " [0.72855314 0.94166667 0.93067227 0.92619048 0.86737805]\n",
      " [0.72064394 0.76944444 0.96347032 0.89355322 0.89718482]\n",
      " [0.66555184 0.94092827 0.81691542 0.94077961 0.9047619 ]\n",
      " [0.76988636 0.64148528 0.86659664 0.80942623 0.89627329]\n",
      " [0.71190781 0.67349552 0.91059028 0.91571429 0.89129032]\n",
      " [0.63764405 0.85083714 0.88055556 0.91633987 0.88950617]\n",
      " [0.81302521 0.75416667 0.88611111 0.86349206 0.89146341]\n",
      " [0.70294494 0.76883117 0.93233831 0.93118687 0.89190051]\n",
      " [0.79285714 0.82916667 0.91190476 0.92357143 0.87329193]\n",
      " [0.73021182 0.90371622 0.80669711 0.95061728 0.92063492]\n",
      " [0.71547619 0.83226633 0.86869748 0.94714286 0.89486859]\n",
      " [0.71959027 0.77777778 0.88656716 0.90318302 0.90688776]\n",
      " [0.70422535 0.70464135 0.78690476 0.92251462 0.96459627]\n",
      " [0.75473485 0.87938596 0.78214286 0.88111888 0.8691358 ]]\n"
     ]
    }
   ],
   "source": [
    "scores = np.zeros((20,5))\n",
    "for i in range(20):\n",
    "    data_train, data_test = train_test_split(data, test_size=0.2, stratify=data[:,-2])\n",
    "    clf = MLPClassifier(max_iter=1000)\n",
    "    clf.fit(data_train[:,:-2], data_train[:,-2])\n",
    "    arg =  np.argsort(data_test[:,-1])\n",
    "    data_list = np.array_split(data_test[arg], 5, axis=0)\n",
    "    for j,d in enumerate(data_list):\n",
    "        y_score = clf.predict_proba(d[:,:-2])\n",
    "        scores[i, j] = roc_auc_score(d[:,-2], y_score[:,1])\n",
    "print(np.mean(scores, axis=0))\n",
    "print(np.std(scores, axis=0))\n",
    "print(scores)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### RNN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "SMILES is too long (256)\n",
      "SMILES is too long (239)\n",
      "SMILES is too long (258)\n",
      "SMILES is too long (380)\n",
      "SMILES is too long (332)\n",
      "There are 2050 molecules. It will take a little time.\n",
      "(2050, 1024)\n"
     ]
    }
   ],
   "source": [
    "x_split = [split(sm) for sm in df['smiles'].values]\n",
    "xid, _ = get_array(x_split)\n",
    "X = rnn.encode(torch.t(xid))\n",
    "print(X.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2050, 1026)"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l = np.array([len(smiles) for smiles in df['smiles'].values]).reshape((-1,1))\n",
    "y = df['p_np'].values.reshape((-1,1))\n",
    "data = np.hstack([X, y, l])\n",
    "data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.8434636  0.90431754 0.9092739  0.94782841 0.95828293]\n",
      "[0.04018736 0.044927   0.03594954 0.0189617  0.02197666]\n",
      "[[0.82380952 0.9254386  0.88068182 0.90086207 0.9385808 ]\n",
      " [0.92987013 0.89142857 0.86956522 0.94378307 0.95574163]\n",
      " [0.81081081 0.95281583 0.9264214  0.94325718 0.93480861]\n",
      " [0.82095238 0.93333333 0.87068004 0.98653846 0.90833333]\n",
      " [0.83946488 0.80694444 0.90138889 0.95129665 0.96289425]\n",
      " [0.84615385 0.87719298 0.91243781 0.94516129 0.98867024]\n",
      " [0.89186176 0.81887367 0.82878151 0.95725806 0.99762046]\n",
      " [0.78095238 0.91047619 0.93809524 0.9476787  0.96541443]\n",
      " [0.8297619  0.91385135 0.925      0.93493819 0.98145933]\n",
      " [0.81785714 0.94238156 0.94029851 0.94319131 0.97916667]\n",
      " [0.8644958  0.94517544 0.90412486 0.92794613 0.95855856]\n",
      " [0.75927602 0.83445946 0.94027778 0.95320513 0.959375  ]\n",
      " [0.85189076 0.91165173 0.96       0.92887931 0.97977394]\n",
      " [0.88860435 0.94063927 0.95170455 0.95286195 0.95036765]\n",
      " [0.86268657 0.88928571 0.92829706 0.94193548 0.9791294 ]\n",
      " [0.875      0.88380952 0.94047619 0.948125   0.93779904]\n",
      " [0.88304094 0.85810811 0.87848384 0.97577277 0.93181818]\n",
      " [0.82202305 0.96474359 0.94648829 0.92999263 0.9692029 ]\n",
      " [0.87142857 0.95119048 0.84726867 0.96703297 0.94914216]\n",
      " [0.7993311  0.93455099 0.8950064  0.97685185 0.93780193]]\n"
     ]
    }
   ],
   "source": [
    "scores = np.zeros((20,5))\n",
    "for i in range(20):\n",
    "    data_train, data_test = train_test_split(data, test_size=0.2, stratify=data[:,-2])\n",
    "    clf = MLPClassifier(max_iter=1000)\n",
    "    clf.fit(data_train[:,:-2], data_train[:,-2])\n",
    "    arg =  np.argsort(data_test[:,-1])\n",
    "    data_list = np.array_split(data_test[arg], 5, axis=0)\n",
    "    for j,d in enumerate(data_list):\n",
    "        y_score = clf.predict_proba(d[:,:-2])\n",
    "        scores[i, j] = roc_auc_score(d[:,-2], y_score[:,1])\n",
    "print(np.mean(scores, axis=0))\n",
    "print(np.std(scores, axis=0))\n",
    "print(scores)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### GC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import deepchem as dc\n",
    "from deepchem.models.tensorgraph.models.graph_models import GraphConvModel"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Loading raw samples now.\n",
      "shard_size: 8192\n",
      "About to start loading CSV from data/bbbp.csv\n",
      "Loading shard 1 of size 8192.\n",
      "Featurizing sample 0\n",
      "Featurizing sample 1000\n",
      "Featurizing sample 2000\n",
      "TIMING: featurizing shard 0 took 8.481 s\n",
      "TIMING: dataset construction took 10.422 s\n",
      "Loading dataset from disk.\n"
     ]
    }
   ],
   "source": [
    "featurizer = dc.feat.ConvMolFeaturizer()\n",
    "loader = dc.data.CSVLoader(\n",
    "      tasks=['p_np'],\n",
    "      smiles_field='smiles',\n",
    "      featurizer=featurizer)\n",
    "dataset = loader.featurize('data/bbbp.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TIMING: dataset construction took 1.491 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.361 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.358 s\n",
      "Loading dataset from disk.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/honda/anaconda3/envs/deepchem/lib/python3.5/site-packages/tensorflow/python/ops/gradients_impl.py:98: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.\n",
      "  \"Converting sparse IndexedSlices to a dense Tensor of unknown shape. \"\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TIMING: dataset construction took 0.530 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.238 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8947368421052632]\n",
      "TIMING: dataset construction took 0.511 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.235 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9306451612903226]\n",
      "TIMING: dataset construction took 0.536 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.228 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8742424242424243]\n",
      "TIMING: dataset construction took 0.549 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.254 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.960967993754879]\n",
      "TIMING: dataset construction took 0.750 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.245 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9277389277389279]\n",
      "TIMING: dataset construction took 1.485 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.352 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.347 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.808 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.230 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9619909502262443]\n",
      "TIMING: dataset construction took 0.504 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.234 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9185520361990951]\n",
      "TIMING: dataset construction took 0.511 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.234 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9629032258064516]\n",
      "TIMING: dataset construction took 0.504 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.224 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8563622170179548]\n",
      "TIMING: dataset construction took 0.850 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.220 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8657105606258149]\n",
      "TIMING: dataset construction took 1.475 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.360 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.361 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.525 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.233 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9063231850117096]\n",
      "TIMING: dataset construction took 0.524 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.250 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9383680555555556]\n",
      "TIMING: dataset construction took 0.556 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.236 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9290322580645161]\n",
      "TIMING: dataset construction took 0.529 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.235 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9476787030213707]\n",
      "TIMING: dataset construction took 0.525 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.234 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9886363636363636]\n",
      "TIMING: dataset construction took 1.476 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.406 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.383 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.597 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.274 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8505291005291006]\n",
      "TIMING: dataset construction took 0.586 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.262 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8996632996632996]\n",
      "TIMING: dataset construction took 0.603 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.263 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.809090909090909]\n",
      "TIMING: dataset construction took 0.847 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.260 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9158371040723983]\n",
      "TIMING: dataset construction took 0.580 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.255 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9298387096774193]\n",
      "TIMING: dataset construction took 1.506 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.370 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.359 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.551 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.241 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.828125]\n",
      "TIMING: dataset construction took 0.527 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.237 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9465329991645781]\n",
      "TIMING: dataset construction took 0.528 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.239 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9348958333333333]\n",
      "TIMING: dataset construction took 0.513 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.236 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8531746031746033]\n",
      "TIMING: dataset construction took 0.539 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.240 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8924242424242423]\n",
      "TIMING: dataset construction took 1.492 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.346 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.346 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.507 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.226 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8778409090909092]\n",
      "TIMING: dataset construction took 0.578 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.224 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9114427860696517]\n",
      "TIMING: dataset construction took 0.515 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.222 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9435763888888888]\n",
      "TIMING: dataset construction took 0.500 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.235 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.896780303030303]\n",
      "TIMING: dataset construction took 0.513 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.459 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.896326530612245]\n",
      "TIMING: dataset construction took 1.475 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.345 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.353 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.499 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.225 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.930880713489409]\n",
      "TIMING: dataset construction took 0.494 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.244 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8787330316742081]\n",
      "TIMING: dataset construction took 0.521 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.230 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8681818181818182]\n",
      "TIMING: dataset construction took 0.505 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.224 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8949652777777777]\n",
      "TIMING: dataset construction took 0.826 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.211 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9345679012345679]\n",
      "TIMING: dataset construction took 1.548 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.351 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.338 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.488 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.289 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9393939393939393]\n",
      "TIMING: dataset construction took 0.516 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.243 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9520624303232998]\n",
      "TIMING: dataset construction took 0.589 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.246 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8706240487062404]\n",
      "TIMING: dataset construction took 0.517 s\n",
      "Loading dataset from disk.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TIMING: dataset construction took 0.245 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9299926308032425]\n",
      "TIMING: dataset construction took 0.521 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.225 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8170940170940171]\n",
      "TIMING: dataset construction took 1.525 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.389 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.399 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.545 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.252 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8711943793911008]\n",
      "TIMING: dataset construction took 0.585 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.257 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.821969696969697]\n",
      "TIMING: dataset construction took 0.572 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.241 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8823529411764706]\n",
      "TIMING: dataset construction took 0.527 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.254 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9582491582491584]\n",
      "TIMING: dataset construction took 0.563 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.250 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.915991156963891]\n",
      "TIMING: dataset construction took 1.500 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.358 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.348 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.512 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.229 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.89520624303233]\n",
      "TIMING: dataset construction took 0.516 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.232 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9633099141295862]\n",
      "TIMING: dataset construction took 0.497 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.236 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8386363636363636]\n",
      "TIMING: dataset construction took 0.503 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.230 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9180327868852459]\n",
      "TIMING: dataset construction took 0.526 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.229 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8709016393442622]\n",
      "TIMING: dataset construction took 1.522 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.381 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.368 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.527 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.236 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9137931034482758]\n",
      "TIMING: dataset construction took 0.541 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.237 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9464285714285714]\n",
      "TIMING: dataset construction took 0.551 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.260 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8090277777777779]\n",
      "TIMING: dataset construction took 0.527 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.483 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8343891402714931]\n",
      "TIMING: dataset construction took 0.553 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.238 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9333791208791209]\n",
      "TIMING: dataset construction took 1.498 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.340 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.340 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.497 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.228 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9036458333333333]\n",
      "TIMING: dataset construction took 0.495 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.221 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9273182957393483]\n",
      "TIMING: dataset construction took 0.509 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.223 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9188134270101482]\n",
      "TIMING: dataset construction took 0.503 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.226 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9147869674185464]\n",
      "TIMING: dataset construction took 0.797 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.212 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8735362997658079]\n",
      "TIMING: dataset construction took 1.497 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.365 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.359 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.569 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.233 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9086651053864169]\n",
      "TIMING: dataset construction took 0.533 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.245 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8997789240972733]\n",
      "TIMING: dataset construction took 0.551 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.251 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8298387096774194]\n",
      "TIMING: dataset construction took 0.529 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.239 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9758064516129032]\n",
      "TIMING: dataset construction took 0.819 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.232 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9034090909090909]\n",
      "TIMING: dataset construction took 1.563 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.352 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.351 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.500 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.229 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9024199843871975]\n",
      "TIMING: dataset construction took 0.519 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.234 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9507575757575757]\n",
      "TIMING: dataset construction took 0.546 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.235 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.918552036199095]\n",
      "TIMING: dataset construction took 0.513 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.223 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8836805555555556]\n",
      "TIMING: dataset construction took 0.812 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.218 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8797619047619049]\n",
      "TIMING: dataset construction took 1.498 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.365 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.361 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.529 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.237 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9710407239819004]\n",
      "TIMING: dataset construction took 0.823 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.245 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9387096774193548]\n",
      "TIMING: dataset construction took 0.571 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.238 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9239766081871346]\n",
      "TIMING: dataset construction took 0.535 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.238 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8742081447963801]\n",
      "TIMING: dataset construction took 0.531 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.231 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9067405355493998]\n",
      "TIMING: dataset construction took 1.446 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.381 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.384 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.546 s\n",
      "Loading dataset from disk.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TIMING: dataset construction took 0.259 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9601648351648351]\n",
      "TIMING: dataset construction took 0.553 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.242 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9357638888888888]\n",
      "TIMING: dataset construction took 0.559 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.253 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9166666666666667]\n",
      "TIMING: dataset construction took 0.540 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.248 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9484848484848485]\n",
      "TIMING: dataset construction took 0.832 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.240 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8751393534002229]\n",
      "TIMING: dataset construction took 1.533 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.344 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.340 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.497 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.226 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8570135746606335]\n",
      "TIMING: dataset construction took 0.487 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.225 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.7857142857142858]\n",
      "TIMING: dataset construction took 0.509 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.231 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.901639344262295]\n",
      "TIMING: dataset construction took 0.503 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.231 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9222689075630253]\n",
      "TIMING: dataset construction took 0.498 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.470 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.925]\n",
      "TIMING: dataset construction took 1.468 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.385 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.386 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.569 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.246 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9212669683257919]\n",
      "TIMING: dataset construction took 0.560 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.264 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9438914027149321]\n",
      "TIMING: dataset construction took 0.574 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.259 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9034635224760501]\n",
      "TIMING: dataset construction took 0.550 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.242 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8905263157894736]\n",
      "TIMING: dataset construction took 0.571 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.259 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9386464263124605]\n",
      "TIMING: dataset construction took 1.519 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.352 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.348 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.511 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.225 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.84966838614591]\n",
      "TIMING: dataset construction took 0.509 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.226 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9159663865546219]\n",
      "TIMING: dataset construction took 0.511 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.225 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9191176470588236]\n",
      "TIMING: dataset construction took 0.513 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.238 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9192982456140351]\n",
      "TIMING: dataset construction took 0.831 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.227 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8975]\n",
      "TIMING: dataset construction took 1.549 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.360 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.356 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.824 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.225 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9492537313432836]\n",
      "TIMING: dataset construction took 0.517 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.232 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9117876658860264]\n",
      "TIMING: dataset construction took 0.534 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.228 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9704861111111112]\n",
      "TIMING: dataset construction took 0.508 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.231 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8101010101010102]\n",
      "TIMING: dataset construction took 0.517 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 0.523 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8439560439560441]\n",
      "[0.90465768 0.9158698  0.8962559  0.90527957 0.90081494]\n",
      "[0.039465   0.0429603  0.04615946 0.04302689 0.03747349]\n",
      "[[0.89473684 0.93064516 0.87424242 0.96096799 0.92773893]\n",
      " [0.96199095 0.91855204 0.96290323 0.85636222 0.86571056]\n",
      " [0.90632319 0.93836806 0.92903226 0.9476787  0.98863636]\n",
      " [0.8505291  0.8996633  0.80909091 0.9158371  0.92983871]\n",
      " [0.828125   0.946533   0.93489583 0.8531746  0.89242424]\n",
      " [0.87784091 0.91144279 0.94357639 0.8967803  0.89632653]\n",
      " [0.93088071 0.87873303 0.86818182 0.89496528 0.9345679 ]\n",
      " [0.93939394 0.95206243 0.87062405 0.92999263 0.81709402]\n",
      " [0.87119438 0.8219697  0.88235294 0.95824916 0.91599116]\n",
      " [0.89520624 0.96330991 0.83863636 0.91803279 0.87090164]\n",
      " [0.9137931  0.94642857 0.80902778 0.83438914 0.93337912]\n",
      " [0.90364583 0.9273183  0.91881343 0.91478697 0.8735363 ]\n",
      " [0.90866511 0.89977892 0.82983871 0.97580645 0.90340909]\n",
      " [0.90241998 0.95075758 0.91855204 0.88368056 0.8797619 ]\n",
      " [0.97104072 0.93870968 0.92397661 0.87420814 0.90674054]\n",
      " [0.96016484 0.93576389 0.91666667 0.94848485 0.87513935]\n",
      " [0.85701357 0.78571429 0.90163934 0.92226891 0.925     ]\n",
      " [0.92126697 0.9438914  0.90346352 0.89052632 0.93864643]\n",
      " [0.84966839 0.91596639 0.91911765 0.91929825 0.8975    ]\n",
      " [0.94925373 0.91178767 0.97048611 0.81010101 0.84395604]]\n"
     ]
    }
   ],
   "source": [
    "scores = np.zeros((20,5))\n",
    "metrics = [dc.metrics.Metric(dc.metrics.roc_auc_score)]\n",
    "for i in range(20):\n",
    "    splitter = dc.splits.RandomStratifiedSplitter()\n",
    "    train, val, _ = splitter.train_valid_test_split(dataset, frac_train=0.8, frac_valid=0.2, frac_test=0)\n",
    "    clf = GraphConvModel(n_tasks=1, batch_size=64, mode='classification')\n",
    "    clf.fit(train)\n",
    "    l = [len(smiles) for smiles in val.ids]\n",
    "    arg = np.argsort(l)\n",
    "    for j in range(5):\n",
    "        val_j = val.select(arg).select(np.arange(j*82,(j+1)*82))\n",
    "        scores[i,j] = clf.evaluate(val_j, metrics)['roc_auc_score']\n",
    "print(np.mean(scores, axis=0))\n",
    "print(np.std(scores, axis=0))\n",
    "print(scores)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = [1, 2, 3, 4, 5]\n",
    "st = [0.85862067, 0.90392176, 0.95300735, 0.95516617, 0.93931837]\n",
    "ecfp = [0.74022413, 0.7962287,  0.87348057, 0.90701257, 0.89906024]\n",
    "rn = [0.8434636,  0.90431754, 0.9092739,  0.94782841, 0.95828293]\n",
    "gc = [0.90465768, 0.9158698,  0.8962559,  0.90527957, 0.90081494]\n",
    "plt.plot(x, st, label='ST')\n",
    "plt.plot(x, ecfp, label='ECFP')\n",
    "plt.plot(x, rn, label='RNNS2S')\n",
    "plt.plot(x, gc, label='GraphConv')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# HIV"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(41127, 3)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>smiles</th>\n",
       "      <th>activity</th>\n",
       "      <th>HIV_active</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>CCC1=[O+][Cu-3]2([O+]=C(CC)C1)[O+]=C(CC)CC(CC)...</td>\n",
       "      <td>CI</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>C(=Cc1ccccc1)C1=[O+][Cu-3]2([O+]=C(C=Cc3ccccc3...</td>\n",
       "      <td>CI</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>CC(=O)N1c2ccccc2Sc2c1ccc1ccccc21</td>\n",
       "      <td>CI</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Nc1ccc(C=Cc2ccc(N)cc2S(=O)(=O)O)c(S(=O)(=O)O)c1</td>\n",
       "      <td>CI</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>O=S(=O)(O)CCS(=O)(=O)O</td>\n",
       "      <td>CI</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                              smiles activity  HIV_active\n",
       "0  CCC1=[O+][Cu-3]2([O+]=C(CC)C1)[O+]=C(CC)CC(CC)...       CI           0\n",
       "1  C(=Cc1ccccc1)C1=[O+][Cu-3]2([O+]=C(C=Cc3ccccc3...       CI           0\n",
       "2                   CC(=O)N1c2ccccc2Sc2c1ccc1ccccc21       CI           0\n",
       "3    Nc1ccc(C=Cc2ccc(N)cc2S(=O)(=O)O)c(S(=O)(=O)O)c1       CI           0\n",
       "4                             O=S(=O)(O)CCS(=O)(=O)O       CI           0"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_csv('data/hiv.csv')\n",
    "print(df.shape)\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.hist(list(map(len, df['smiles'].values)), bins=20)\n",
    "plt.xlabel('SMILES length')\n",
    "plt.ylabel('counts')\n",
    "plt.title('HIV')\n",
    "plt.grid()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### ST"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "SMILES is too long (220)\n",
      "SMILES is too long (274)\n",
      "SMILES is too long (247)\n",
      "SMILES is too long (226)\n",
      "SMILES is too long (244)\n",
      "SMILES is too long (243)\n",
      "SMILES is too long (253)\n",
      "SMILES is too long (266)\n",
      "SMILES is too long (346)\n",
      "SMILES is too long (232)\n",
      "SMILES is too long (242)\n",
      "SMILES is too long (247)\n",
      "SMILES is too long (240)\n",
      "SMILES is too long (370)\n",
      "SMILES is too long (224)\n",
      "SMILES is too long (283)\n",
      "SMILES is too long (265)\n",
      "SMILES is too long (240)\n",
      "SMILES is too long (219)\n",
      "SMILES is too long (246)\n",
      "SMILES is too long (243)\n",
      "SMILES is too long (284)\n",
      "SMILES is too long (270)\n",
      "SMILES is too long (232)\n",
      "SMILES is too long (260)\n",
      "SMILES is too long (284)\n",
      "SMILES is too long (284)\n",
      "SMILES is too long (439)\n",
      "SMILES is too long (491)\n",
      "SMILES is too long (439)\n",
      "SMILES is too long (296)\n",
      "SMILES is too long (341)\n",
      "SMILES is too long (285)\n",
      "SMILES is too long (327)\n",
      "SMILES is too long (341)\n",
      "SMILES is too long (400)\n",
      "SMILES is too long (263)\n",
      "SMILES is too long (238)\n",
      "SMILES is too long (383)\n",
      "SMILES is too long (360)\n",
      "SMILES is too long (233)\n",
      "SMILES is too long (365)\n",
      "SMILES is too long (265)\n",
      "SMILES is too long (240)\n",
      "SMILES is too long (223)\n",
      "There are 41127 molecules. It will take a little time.\n",
      "(41127, 1024)\n"
     ]
    }
   ],
   "source": [
    "x_split = [split(sm) for sm in df['smiles'].values]\n",
    "xid, _ = get_array(x_split)\n",
    "X = trfm.encode(torch.t(xid))\n",
    "print(X.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(41127, 1026)"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l = np.array([len(smiles) for smiles in df['smiles'].values]).reshape((-1,1))\n",
    "y = df['HIV_active'].values.reshape((-1,1))\n",
    "data = np.hstack([X, y, l])\n",
    "data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.68408001 0.71874454 0.72072563 0.75484625 0.84941198]\n",
      "[0.0418942  0.03758716 0.03403227 0.02725244 0.02363938]\n",
      "[[0.65911583 0.65470844 0.75336015 0.75953721 0.83253211]\n",
      " [0.66778572 0.73401389 0.6932861  0.78113576 0.90705393]\n",
      " [0.7432677  0.77027027 0.80317699 0.75220442 0.8399002 ]\n",
      " [0.6402944  0.78604105 0.68218182 0.72248611 0.83334452]\n",
      " [0.69621223 0.74677163 0.70526988 0.70906888 0.81640345]\n",
      " [0.68411681 0.69620696 0.72403427 0.75650162 0.86491239]\n",
      " [0.67641477 0.71251749 0.7032924  0.77700566 0.8359787 ]\n",
      " [0.66993761 0.75655374 0.74871473 0.76538039 0.83946391]\n",
      " [0.70805877 0.7380428  0.6978451  0.71525    0.82735263]\n",
      " [0.71676864 0.68105651 0.689125   0.74966691 0.84835796]\n",
      " [0.75587871 0.74469057 0.78052353 0.77199436 0.83365283]\n",
      " [0.69330573 0.6294501  0.73707165 0.78579189 0.82447868]\n",
      " [0.67520237 0.7203959  0.72279667 0.6917919  0.88738011]\n",
      " [0.65433057 0.71031343 0.68566379 0.77350174 0.86105337]\n",
      " [0.59118066 0.69183758 0.73889931 0.72423405 0.85148055]\n",
      " [0.68457096 0.7568573  0.74159402 0.76380971 0.82762826]\n",
      " [0.77889364 0.7338324  0.74479695 0.78127667 0.84769739]\n",
      " [0.6919967  0.71054517 0.68857532 0.78121588 0.89136145]\n",
      " [0.63916256 0.68777751 0.67145052 0.75200212 0.84799526]\n",
      " [0.65510585 0.71300799 0.70285431 0.78306982 0.87021189]]\n"
     ]
    }
   ],
   "source": [
    "scores = np.zeros((20,5))\n",
    "for i in range(20):\n",
    "    data_train, data_test = train_test_split(data, test_size=0.2, stratify=data[:,-2])\n",
    "    clf = MLPClassifier(max_iter=1000)\n",
    "    clf.fit(data_train[:,:-2], data_train[:,-2])\n",
    "    arg =  np.argsort(data_test[:,-1])\n",
    "    data_list = np.array_split(data_test[arg], 5, axis=0)\n",
    "    for j,d in enumerate(data_list):\n",
    "        y_score = clf.predict_proba(d[:,:-2])\n",
    "        scores[i, j] = roc_auc_score(d[:,-2], y_score[:,1])\n",
    "print(np.mean(scores, axis=0))\n",
    "print(np.std(scores, axis=0))\n",
    "print(scores)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### ECFP"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "41127 41127\n"
     ]
    }
   ],
   "source": [
    "x,X,y = extract_morgan(df['smiles'].values, df['HIV_active'].values)\n",
    "print(len(X), len(y))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(41127, 1026)"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l = np.array([len(smiles) for smiles in x]).reshape((-1,1))\n",
    "y = y.reshape((-1,1))\n",
    "data = np.hstack([X, y, l])\n",
    "data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.7087033  0.76279766 0.79429214 0.7742506  0.88217889]\n",
      "[0.04014194 0.04618025 0.02731838 0.04298497 0.02132686]\n",
      "[[0.68574889 0.74119444 0.75294342 0.77923702 0.87965669]\n",
      " [0.71251557 0.71473692 0.80106137 0.78396824 0.86908011]\n",
      " [0.7499509  0.75153505 0.82931123 0.80115059 0.90815412]\n",
      " [0.70197748 0.76211341 0.76246739 0.77647797 0.87513115]\n",
      " [0.70566796 0.71274388 0.79949384 0.80244514 0.90407172]\n",
      " [0.71076087 0.72685762 0.8037206  0.75886503 0.91740665]\n",
      " [0.73512273 0.72744835 0.78099562 0.75529639 0.86694463]\n",
      " [0.69983962 0.65378265 0.78634483 0.81503998 0.88522404]\n",
      " [0.75599551 0.80350491 0.75110656 0.73633333 0.84458743]\n",
      " [0.6490928  0.70788447 0.82233621 0.78059168 0.87397817]\n",
      " [0.74834369 0.78822545 0.80475271 0.80121428 0.87402657]\n",
      " [0.78167596 0.83986587 0.81146726 0.78625228 0.87510339]\n",
      " [0.78219629 0.7891305  0.83621738 0.75834996 0.85541347]\n",
      " [0.69744511 0.78182592 0.755125   0.76734881 0.8774519 ]\n",
      " [0.65732625 0.75556113 0.81983019 0.71860755 0.88080927]\n",
      " [0.68129745 0.82679797 0.79782252 0.85265175 0.92135287]\n",
      " [0.70573639 0.82642016 0.81800405 0.64038582 0.88649689]\n",
      " [0.70512315 0.75639462 0.78468003 0.76346484 0.84451167]\n",
      " [0.62614947 0.80488324 0.74734036 0.83005352 0.89401457]\n",
      " [0.68209998 0.78504673 0.82082221 0.77727772 0.91016248]]\n"
     ]
    }
   ],
   "source": [
    "scores = np.zeros((20,5))\n",
    "for i in range(20):\n",
    "    data_train, data_test = train_test_split(data, test_size=0.2, stratify=data[:,-2])\n",
    "    clf = MLPClassifier(max_iter=1000)\n",
    "    clf.fit(data_train[:,:-2], data_train[:,-2])\n",
    "    arg =  np.argsort(data_test[:,-1])\n",
    "    data_list = np.array_split(data_test[arg], 5, axis=0)\n",
    "    for j,d in enumerate(data_list):\n",
    "        y_score = clf.predict_proba(d[:,:-2])\n",
    "        scores[i, j] = roc_auc_score(d[:,-2], y_score[:,1])\n",
    "print(np.mean(scores, axis=0))\n",
    "print(np.std(scores, axis=0))\n",
    "print(scores)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### RNN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "SMILES is too long (220)\n",
      "SMILES is too long (274)\n",
      "SMILES is too long (247)\n",
      "SMILES is too long (226)\n",
      "SMILES is too long (244)\n",
      "SMILES is too long (243)\n",
      "SMILES is too long (253)\n",
      "SMILES is too long (266)\n",
      "SMILES is too long (346)\n",
      "SMILES is too long (232)\n",
      "SMILES is too long (242)\n",
      "SMILES is too long (247)\n",
      "SMILES is too long (240)\n",
      "SMILES is too long (370)\n",
      "SMILES is too long (224)\n",
      "SMILES is too long (283)\n",
      "SMILES is too long (265)\n",
      "SMILES is too long (240)\n",
      "SMILES is too long (219)\n",
      "SMILES is too long (246)\n",
      "SMILES is too long (243)\n",
      "SMILES is too long (284)\n",
      "SMILES is too long (270)\n",
      "SMILES is too long (232)\n",
      "SMILES is too long (260)\n",
      "SMILES is too long (284)\n",
      "SMILES is too long (284)\n",
      "SMILES is too long (439)\n",
      "SMILES is too long (491)\n",
      "SMILES is too long (439)\n",
      "SMILES is too long (296)\n",
      "SMILES is too long (341)\n",
      "SMILES is too long (285)\n",
      "SMILES is too long (327)\n",
      "SMILES is too long (341)\n",
      "SMILES is too long (400)\n",
      "SMILES is too long (263)\n",
      "SMILES is too long (238)\n",
      "SMILES is too long (383)\n",
      "SMILES is too long (360)\n",
      "SMILES is too long (233)\n",
      "SMILES is too long (365)\n",
      "SMILES is too long (265)\n",
      "SMILES is too long (240)\n",
      "SMILES is too long (223)\n",
      "There are 41127 molecules. It will take a little time.\n",
      "(41127, 1024)\n"
     ]
    }
   ],
   "source": [
    "x_split = [split(sm) for sm in df['smiles'].values]\n",
    "xid, _ = get_array(x_split)\n",
    "X = rnn.encode(torch.t(xid))\n",
    "print(X.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(41127, 1026)"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "l = np.array([len(smiles) for smiles in df['smiles'].values]).reshape((-1,1))\n",
    "y = df['HIV_active'].values.reshape((-1,1))\n",
    "data = np.hstack([X, y, l])\n",
    "data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.65276065 0.65089961 0.66376145 0.72666168 0.8337165 ]\n",
      "[0.05214281 0.05239721 0.03849954 0.03402176 0.02286239]\n",
      "[[0.62129055 0.70089824 0.67328215 0.73721891 0.80072632]\n",
      " [0.63953115 0.64006284 0.5764437  0.71689817 0.86289038]\n",
      " [0.65029706 0.65885254 0.65219968 0.74505805 0.80827753]\n",
      " [0.66150572 0.79341615 0.6647862  0.73201265 0.86392336]\n",
      " [0.71531528 0.67482112 0.70436258 0.76276017 0.87538908]\n",
      " [0.61554096 0.68051464 0.63355399 0.72962691 0.81790525]\n",
      " [0.57074814 0.60250696 0.69031823 0.72876927 0.84251032]\n",
      " [0.69295915 0.61300572 0.64933246 0.70344295 0.82528462]\n",
      " [0.74739736 0.72447843 0.60610337 0.76150595 0.82557862]\n",
      " [0.67075083 0.6507192  0.6255948  0.7645389  0.85425061]\n",
      " [0.52683511 0.57850522 0.70451096 0.65691195 0.78735348]\n",
      " [0.7003701  0.71025181 0.74415113 0.70192062 0.80567398]\n",
      " [0.62790373 0.63168299 0.71729167 0.72073941 0.85284511]\n",
      " [0.63170987 0.62196922 0.65352621 0.73991667 0.84704694]\n",
      " [0.71133526 0.59965065 0.62274999 0.67455203 0.83472614]\n",
      " [0.68192151 0.69260018 0.67611386 0.80896957 0.82661025]\n",
      " [0.59469421 0.59410825 0.68482711 0.68883977 0.81929424]\n",
      " [0.62396884 0.6281096  0.65773443 0.73694044 0.85127253]\n",
      " [0.69952799 0.61068339 0.66315087 0.7323511  0.8480114 ]\n",
      " [0.67161012 0.61115504 0.67519564 0.69026004 0.82475989]]\n"
     ]
    }
   ],
   "source": [
    "scores = np.zeros((20,5))\n",
    "for i in range(20):\n",
    "    data_train, data_test = train_test_split(data, test_size=0.2, stratify=data[:,-2])\n",
    "    clf = MLPClassifier(max_iter=1000)\n",
    "    clf.fit(data_train[:,:-2], data_train[:,-2])\n",
    "    arg =  np.argsort(data_test[:,-1])\n",
    "    data_list = np.array_split(data_test[arg], 5, axis=0)\n",
    "    for j,d in enumerate(data_list):\n",
    "        y_score = clf.predict_proba(d[:,:-2])\n",
    "        scores[i, j] = roc_auc_score(d[:,-2], y_score[:,1])\n",
    "print(np.mean(scores, axis=0))\n",
    "print(np.std(scores, axis=0))\n",
    "print(scores)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### GC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Loading raw samples now.\n",
      "shard_size: 8192\n",
      "About to start loading CSV from data/hiv.csv\n",
      "Loading shard 1 of size 8192.\n",
      "Featurizing sample 0\n",
      "Featurizing sample 1000\n",
      "Featurizing sample 2000\n",
      "Featurizing sample 3000\n",
      "Featurizing sample 4000\n",
      "Featurizing sample 5000\n",
      "Featurizing sample 6000\n",
      "Featurizing sample 7000\n",
      "Featurizing sample 8000\n",
      "TIMING: featurizing shard 0 took 31.829 s\n",
      "Loading shard 2 of size 8192.\n",
      "Featurizing sample 0\n",
      "Featurizing sample 1000\n",
      "Featurizing sample 2000\n",
      "Featurizing sample 3000\n",
      "Featurizing sample 4000\n",
      "Featurizing sample 5000\n",
      "Featurizing sample 6000\n",
      "Featurizing sample 7000\n",
      "Featurizing sample 8000\n",
      "TIMING: featurizing shard 1 took 33.355 s\n",
      "Loading shard 3 of size 8192.\n",
      "Featurizing sample 0\n",
      "Featurizing sample 1000\n",
      "Featurizing sample 2000\n",
      "Featurizing sample 3000\n",
      "Featurizing sample 4000\n",
      "Featurizing sample 5000\n",
      "Featurizing sample 6000\n",
      "Featurizing sample 7000\n",
      "Featurizing sample 8000\n",
      "TIMING: featurizing shard 2 took 34.571 s\n",
      "Loading shard 4 of size 8192.\n",
      "Featurizing sample 0\n",
      "Featurizing sample 1000\n",
      "Featurizing sample 2000\n",
      "Featurizing sample 3000\n",
      "Featurizing sample 4000\n",
      "Featurizing sample 5000\n",
      "Featurizing sample 6000\n",
      "Featurizing sample 7000\n",
      "Featurizing sample 8000\n",
      "TIMING: featurizing shard 3 took 33.902 s\n",
      "Loading shard 5 of size 8192.\n",
      "Featurizing sample 0\n",
      "Featurizing sample 1000\n",
      "Featurizing sample 2000\n",
      "Featurizing sample 3000\n",
      "Featurizing sample 4000\n",
      "Featurizing sample 5000\n",
      "Featurizing sample 6000\n",
      "Featurizing sample 7000\n",
      "Featurizing sample 8000\n",
      "TIMING: featurizing shard 4 took 35.040 s\n",
      "Loading shard 6 of size 8192.\n",
      "Featurizing sample 0\n",
      "TIMING: featurizing shard 5 took 0.956 s\n",
      "TIMING: dataset construction took 211.180 s\n",
      "Loading dataset from disk.\n"
     ]
    }
   ],
   "source": [
    "featurizer = dc.feat.ConvMolFeaturizer()\n",
    "loader = dc.data.CSVLoader(\n",
    "      tasks=['HIV_active'],\n",
    "      smiles_field='smiles',\n",
    "      featurizer=featurizer)\n",
    "dataset = loader.featurize('data/hiv.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TIMING: dataset construction took 32.914 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.559 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.626 s\n",
      "Loading dataset from disk.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/honda/anaconda3/envs/deepchem/lib/python3.5/site-packages/tensorflow/python/ops/gradients_impl.py:98: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.\n",
      "  \"Converting sparse IndexedSlices to a dense Tensor of unknown shape. \"\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TIMING: dataset construction took 11.456 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.060 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [1.0]\n",
      "TIMING: dataset construction took 11.642 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.036 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8395061728395061]\n",
      "TIMING: dataset construction took 12.489 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.101 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8961038961038961]\n",
      "TIMING: dataset construction took 12.296 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.784 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [1.0]\n",
      "TIMING: dataset construction took 12.630 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.865 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.6666666666666667]\n",
      "TIMING: dataset construction took 33.411 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.074 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 7.928 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 11.842 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.669 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8173076923076923]\n",
      "TIMING: dataset construction took 11.413 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.548 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8771929824561404]\n",
      "TIMING: dataset construction took 11.208 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.568 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.7130801687763713]\n",
      "TIMING: dataset construction took 11.573 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.682 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9428571428571428]\n",
      "TIMING: dataset construction took 11.300 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.885 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [1.0]\n",
      "TIMING: dataset construction took 34.089 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 9.028 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.752 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 12.710 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.164 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.967948717948718]\n",
      "TIMING: dataset construction took 12.068 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.090 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9844155844155844]\n",
      "TIMING: dataset construction took 12.196 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.850 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.525]\n",
      "TIMING: dataset construction took 13.339 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.480 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.45569620253164556]\n",
      "TIMING: dataset construction took 13.128 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.474 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.99375]\n",
      "TIMING: dataset construction took 34.808 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 9.578 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.114 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 12.122 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.849 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9038961038961039]\n",
      "TIMING: dataset construction took 11.334 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.808 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.675]\n",
      "TIMING: dataset construction took 11.906 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.146 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9647435897435898]\n",
      "TIMING: dataset construction took 11.676 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.030 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.56875]\n",
      "TIMING: dataset construction took 12.380 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.020 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8141891891891893]\n",
      "TIMING: dataset construction took 35.870 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.346 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.218 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 11.609 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.762 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9746835443037976]\n",
      "TIMING: dataset construction took 11.813 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.640 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9662447257383966]\n",
      "TIMING: dataset construction took 11.201 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.928 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8547297297297298]\n",
      "TIMING: dataset construction took 11.937 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.151 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.7043918918918919]\n",
      "TIMING: dataset construction took 12.545 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.854 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [nan]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/honda/anaconda3/envs/deepchem/lib/python3.5/site-packages/deepchem/metrics/__init__.py:363: UserWarning: Error calculating metric roc_auc_score: Only one class present in y_true. ROC AUC score is not defined in that case.\n",
      "  warnings.warn(\"Error calculating metric %s: %s\" % (self.name, e))\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TIMING: dataset construction took 34.506 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.807 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.502 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 13.047 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.186 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [1.0]\n",
      "TIMING: dataset construction took 12.520 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.299 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.7116883116883117]\n",
      "TIMING: dataset construction took 12.981 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.972 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [nan]\n",
      "TIMING: dataset construction took 12.061 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.073 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9259259259259259]\n",
      "TIMING: dataset construction took 12.953 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.934 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.775]\n",
      "TIMING: dataset construction took 36.348 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.549 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.192 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 12.016 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.434 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9198312236286921]\n",
      "TIMING: dataset construction took 12.052 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.121 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9750000000000001]\n",
      "TIMING: dataset construction took 12.669 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.914 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9535864978902953]\n",
      "TIMING: dataset construction took 12.045 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.652 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [1.0]\n",
      "TIMING: dataset construction took 11.513 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.969 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.7257383966244726]\n",
      "TIMING: dataset construction took 36.015 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.513 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.087 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 11.807 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.976 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9506172839506173]\n",
      "TIMING: dataset construction took 11.857 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.803 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8375]\n",
      "TIMING: dataset construction took 11.812 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.623 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.54375]\n",
      "TIMING: dataset construction took 12.376 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.806 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.6666666666666667]\n",
      "TIMING: dataset construction took 11.863 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.583 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.4903846153846154]\n",
      "TIMING: dataset construction took 35.227 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 9.101 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.683 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 12.606 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.192 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.45]\n",
      "TIMING: dataset construction took 12.160 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.138 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.56875]\n",
      "TIMING: dataset construction took 12.619 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.184 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [nan]\n",
      "TIMING: dataset construction took 13.292 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.431 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [nan]\n",
      "TIMING: dataset construction took 12.549 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.215 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9409282700421941]\n",
      "TIMING: dataset construction took 35.815 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 9.439 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 7.997 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 11.667 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.925 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9506172839506173]\n",
      "TIMING: dataset construction took 11.891 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.836 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.7219047619047619]\n",
      "TIMING: dataset construction took 12.263 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.821 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [1.0]\n",
      "TIMING: dataset construction took 11.995 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.243 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9896103896103896]\n",
      "TIMING: dataset construction took 11.343 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.919 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9753086419753086]\n",
      "TIMING: dataset construction took 35.271 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.596 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.419 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 12.386 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.314 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.7468354430379747]\n",
      "TIMING: dataset construction took 11.904 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.661 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [nan]\n",
      "TIMING: dataset construction took 11.965 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.157 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9523809523809523]\n",
      "TIMING: dataset construction took 11.797 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.901 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9455128205128205]\n",
      "TIMING: dataset construction took 11.382 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.024 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.75625]\n",
      "TIMING: dataset construction took 33.748 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.915 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.690 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 12.789 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.885 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.5714285714285714]\n",
      "TIMING: dataset construction took 12.134 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.126 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.7468354430379747]\n",
      "TIMING: dataset construction took 13.476 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.102 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9134615384615385]\n",
      "TIMING: dataset construction took 13.156 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.343 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.12345679012345678]\n",
      "TIMING: dataset construction took 12.863 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.865 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.858974358974359]\n",
      "TIMING: dataset construction took 34.996 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.442 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.189 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 11.703 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.655 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.7662337662337663]\n",
      "TIMING: dataset construction took 12.451 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.881 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [1.0]\n",
      "TIMING: dataset construction took 12.143 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.155 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.5614035087719298]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TIMING: dataset construction took 11.602 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.010 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9775641025641025]\n",
      "TIMING: dataset construction took 11.906 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.781 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.7298701298701298]\n",
      "TIMING: dataset construction took 35.203 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.547 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.323 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 12.364 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.148 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9113924050632911]\n",
      "TIMING: dataset construction took 12.408 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.340 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.69375]\n",
      "TIMING: dataset construction took 11.876 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.641 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8457142857142858]\n",
      "TIMING: dataset construction took 12.704 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.289 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [nan]\n",
      "TIMING: dataset construction took 12.420 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.928 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.95]\n",
      "TIMING: dataset construction took 34.745 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.307 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.040 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 11.484 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.957 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9102564102564104]\n",
      "TIMING: dataset construction took 11.094 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.742 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.012345679012345706]\n",
      "TIMING: dataset construction took 11.310 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.596 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8205128205128205]\n",
      "TIMING: dataset construction took 11.536 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.732 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.98125]\n",
      "TIMING: dataset construction took 11.338 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.904 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.40625]\n",
      "TIMING: dataset construction took 36.729 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 7.964 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 7.784 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 11.927 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.756 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9746835443037976]\n",
      "TIMING: dataset construction took 12.132 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.805 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.6666666666666666]\n",
      "TIMING: dataset construction took 11.736 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.033 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9875]\n",
      "TIMING: dataset construction took 12.084 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.793 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9551282051282052]\n",
      "TIMING: dataset construction took 11.203 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.846 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8888888888888888]\n",
      "TIMING: dataset construction took 35.113 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.015 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 7.924 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 11.568 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.560 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [nan]\n",
      "TIMING: dataset construction took 10.930 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.853 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.7275641025641025]\n",
      "TIMING: dataset construction took 10.932 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.887 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9870129870129871]\n",
      "TIMING: dataset construction took 11.142 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.948 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.7341772151898733]\n",
      "TIMING: dataset construction took 10.997 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.507 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.974025974025974]\n",
      "TIMING: dataset construction took 34.862 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 9.281 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.756 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 12.825 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.853 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.907051282051282]\n",
      "TIMING: dataset construction took 12.705 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.231 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.575]\n",
      "TIMING: dataset construction took 12.125 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.229 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [1.0]\n",
      "TIMING: dataset construction took 12.083 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.857 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9615384615384616]\n",
      "TIMING: dataset construction took 12.888 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.466 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.7403846153846154]\n",
      "TIMING: dataset construction took 35.820 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.573 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 7.274 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 10.689 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.286 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [1.0]\n",
      "TIMING: dataset construction took 10.524 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.312 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.94375]\n",
      "TIMING: dataset construction took 10.225 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.642 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.5833333333333333]\n",
      "TIMING: dataset construction took 10.202 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.722 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.8660578386605784]\n",
      "TIMING: dataset construction took 10.281 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.262 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.7192982456140351]\n",
      "TIMING: dataset construction took 36.296 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 7.572 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 7.335 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 9.951 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.344 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.7875]\n",
      "TIMING: dataset construction took 11.130 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.497 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9844155844155844]\n",
      "TIMING: dataset construction took 10.436 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.754 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.6698717948717949]\n",
      "TIMING: dataset construction took 10.343 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.283 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9125]\n",
      "TIMING: dataset construction took 10.200 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.324 s\n",
      "Loading dataset from disk.\n",
      "computed_metrics: [0.9437500000000001]\n",
      "[nan nan nan nan nan]\n",
      "[nan nan nan nan nan]\n",
      "[[1.         0.83950617 0.8961039  1.         0.66666667]\n",
      " [0.81730769 0.87719298 0.71308017 0.94285714 1.        ]\n",
      " [0.96794872 0.98441558 0.525      0.4556962  0.99375   ]\n",
      " [0.9038961  0.675      0.96474359 0.56875    0.81418919]\n",
      " [0.97468354 0.96624473 0.85472973 0.70439189        nan]\n",
      " [1.         0.71168831        nan 0.92592593 0.775     ]\n",
      " [0.91983122 0.975      0.9535865  1.         0.7257384 ]\n",
      " [0.95061728 0.8375     0.54375    0.66666667 0.49038462]\n",
      " [0.45       0.56875           nan        nan 0.94092827]\n",
      " [0.95061728 0.72190476 1.         0.98961039 0.97530864]\n",
      " [0.74683544        nan 0.95238095 0.94551282 0.75625   ]\n",
      " [0.57142857 0.74683544 0.91346154 0.12345679 0.85897436]\n",
      " [0.76623377 1.         0.56140351 0.9775641  0.72987013]\n",
      " [0.91139241 0.69375    0.84571429        nan 0.95      ]\n",
      " [0.91025641 0.01234568 0.82051282 0.98125    0.40625   ]\n",
      " [0.97468354 0.66666667 0.9875     0.95512821 0.88888889]\n",
      " [       nan 0.7275641  0.98701299 0.73417722 0.97402597]\n",
      " [0.90705128 0.575      1.         0.96153846 0.74038462]\n",
      " [1.         0.94375    0.58333333 0.86605784 0.71929825]\n",
      " [0.7875     0.98441558 0.66987179 0.9125     0.94375   ]]\n"
     ]
    }
   ],
   "source": [
    "from tqdm import tqdm_notebook as tqdm\n",
    "\n",
    "scores = np.zeros((20,5))\n",
    "for i in tqdm(range(20)):\n",
    "    splitter = dc.splits.RandomStratifiedSplitter()\n",
    "    train, val, _ = splitter.train_valid_test_split(dataset, frac_train=0.8, frac_valid=0.2, frac_test=0)\n",
    "    clf = GraphConvModel(n_tasks=1, batch_size=64, mode='classification')\n",
    "    clf.fit(train)\n",
    "    l = [len(smiles) for smiles in val.ids]\n",
    "    arg = np.argsort(l)\n",
    "    for j in range(5):\n",
    "        val_j = val.select(arg).select(np.arange(j*82,(j+1)*82))\n",
    "        y_score = clf.predict(val_j).reshape((-1,2))\n",
    "        scores[i,j] = roc_auc_score(val_j.y.flatten(), y_score[:,1])\n",
    "print(np.mean(scores, axis=0))\n",
    "print(np.std(scores, axis=0))\n",
    "print(scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [],
   "source": [
    "a = np.array(\n",
    "[[1.        , 0.83950617, 0.8961039 , 1.        , 0.66666667],\n",
    " [0.81730769, 0.87719298, 0.71308017, 0.94285714, 1.        ],\n",
    " [0.96794872, 0.98441558, 0.525     , 0.4556962 , 0.99375   ],\n",
    " [0.9038961 , 0.675     , 0.96474359, 0.56875   , 0.81418919],\n",
    " [0.91983122, 0.975     , 0.9535865 , 1.        , 0.7257384 ],\n",
    " [0.95061728, 0.8375    , 0.54375   , 0.66666667, 0.49038462],\n",
    " [0.95061728, 0.72190476, 1.        , 0.98961039, 0.97530864],\n",
    " [0.57142857, 0.74683544, 0.91346154, 0.12345679, 0.85897436],\n",
    " [0.76623377, 1.        , 0.56140351, 0.9775641 , 0.72987013],\n",
    " [0.91025641, 0.01234568, 0.82051282, 0.98125   , 0.40625   ],\n",
    " [0.97468354, 0.66666667, 0.9875    , 0.95512821, 0.88888889],\n",
    " [0.90705128, 0.575     , 1.        , 0.96153846, 0.74038462],\n",
    " [1.        , 0.94375   , 0.58333333, 0.86605784, 0.71929825],\n",
    " [0.7875    , 0.98441558, 0.66987179, 0.9125    , 0.94375   ]])\n",
    "y30 = np.mean(a, axis=0)\n",
    "y31 = np.std(a, axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "98aabcf935434072beea9a58c60f52f0",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(IntProgress(value=0, max=20), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TIMING: dataset construction took 34.133 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 7.917 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 7.695 s\n",
      "Loading dataset from disk.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/honda/anaconda3/envs/deepchem/lib/python3.5/site-packages/tensorflow/python/ops/gradients_impl.py:98: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.\n",
      "  \"Converting sparse IndexedSlices to a dense Tensor of unknown shape. \"\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "TIMING: dataset construction took 11.234 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.917 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 11.925 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.341 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 11.770 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.806 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 11.281 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.929 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 11.279 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.332 s\n",
      "Loading dataset from disk.\n",
      "[0.77777778 0.76875    0.72635135 0.97530864 0.80168776]\n",
      "TIMING: dataset construction took 34.960 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.278 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.094 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 11.291 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.027 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 11.459 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.838 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 11.862 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.995 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 11.457 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.999 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 11.476 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 3.811 s\n",
      "Loading dataset from disk.\n",
      "[0.22222222 0.96296296 0.99038462 0.98125    1.        ]\n",
      "TIMING: dataset construction took 33.637 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 9.254 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 8.903 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 13.088 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.320 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 12.875 s\n",
      "Loading dataset from disk.\n",
      "TIMING: dataset construction took 4.159 s\n",
      "Loading dataset from disk.\n"
     ]
    },
    {
     "ename": "ValueError",
     "evalue": "Only one class present in y_true. ROC AUC score is not defined in that case.",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-83-b29d619eac59>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m     12\u001b[0m         \u001b[0mval_j\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mval\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mselect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mselect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;36m82\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0;36m82\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     13\u001b[0m         \u001b[0my_score\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mclf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mval_j\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m         \u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mroc_auc_score\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mval_j\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mflatten\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_score\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     15\u001b[0m     \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mscores\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     16\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmean\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mscores\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/deepchem/lib/python3.5/site-packages/sklearn/metrics/ranking.py\u001b[0m in \u001b[0;36mroc_auc_score\u001b[0;34m(y_true, y_score, average, sample_weight)\u001b[0m\n\u001b[1;32m    275\u001b[0m     return _average_binary_score(\n\u001b[1;32m    276\u001b[0m         \u001b[0m_binary_roc_auc_score\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_true\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_score\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maverage\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 277\u001b[0;31m         sample_weight=sample_weight)\n\u001b[0m\u001b[1;32m    278\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    279\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/deepchem/lib/python3.5/site-packages/sklearn/metrics/base.py\u001b[0m in \u001b[0;36m_average_binary_score\u001b[0;34m(binary_metric, y_true, y_score, average, sample_weight)\u001b[0m\n\u001b[1;32m     73\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     74\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0my_type\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"binary\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 75\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mbinary_metric\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my_true\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_score\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msample_weight\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msample_weight\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     76\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     77\u001b[0m     \u001b[0mcheck_consistent_length\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my_true\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_score\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msample_weight\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/deepchem/lib/python3.5/site-packages/sklearn/metrics/ranking.py\u001b[0m in \u001b[0;36m_binary_roc_auc_score\u001b[0;34m(y_true, y_score, sample_weight)\u001b[0m\n\u001b[1;32m    266\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m_binary_roc_auc_score\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my_true\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_score\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msample_weight\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    267\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munique\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my_true\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 268\u001b[0;31m             raise ValueError(\"Only one class present in y_true. ROC AUC score \"\n\u001b[0m\u001b[1;32m    269\u001b[0m                              \"is not defined in that case.\")\n\u001b[1;32m    270\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mValueError\u001b[0m: Only one class present in y_true. ROC AUC score is not defined in that case."
     ]
    }
   ],
   "source": [
    "from tqdm import tqdm_notebook as tqdm\n",
    "\n",
    "scores = np.zeros((20,5))\n",
    "for i in tqdm(range(20)):\n",
    "    splitter = dc.splits.RandomStratifiedSplitter()\n",
    "    train, val, _ = splitter.train_valid_test_split(dataset, frac_train=0.8, frac_valid=0.2, frac_test=0)\n",
    "    clf = GraphConvModel(n_tasks=1, batch_size=64, mode='classification')\n",
    "    clf.fit(train)\n",
    "    l = [len(smiles) for smiles in val.ids]\n",
    "    arg = np.argsort(l)\n",
    "    for j in range(5):\n",
    "        val_j = val.select(arg).select(np.arange(j*82,(j+1)*82))\n",
    "        y_score = clf.predict(val_j).reshape((-1,2))\n",
    "        scores[i,j] = roc_auc_score(val_j.y.flatten(), y_score[:,1])\n",
    "    print(scores[i])\n",
    "print(np.mean(scores, axis=0))\n",
    "print(np.std(scores, axis=0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
